代码之家  ›  专栏  ›  技术社区  ›  Roland Tepp

SLF4J/Logback中使用标记的最佳实践

  •  112
  • Roland Tepp  · 技术社区  · 15 年前

    我们在我们的项目中使用SLF4J+Logback组合已经有一段时间了,我们对此非常满意,但是我们的日志策略相当简单,使用简单的基于类的日志记录器,没有像MDC或Markers这样花哨的东西。

    我想知道的是,社区中是否有人真正使用这些功能,以及如何使用它们来改进日志/筛选。

    我特别感兴趣的是在哪里,为什么以及如何使用 [一] 用于记录的标记。它们给我的印象是在日志中添加语义上下文的一个非常简洁的特性——例如,当一个类可能处理多个关注点时,可以使用特定于任务/关注点的标记来区分日志语句。

    在日志中创建和使用标记的最佳实践、约定或策略是什么。

    更新: 我想,我真正想要的并不多 为什么? 使用标记,而不是 怎样 部分-如果存在某种类型的“标准名称”池,则是否有一些命名标记的良好实践(例如使用带空格的纯文本或以破折号/下划线/标点符号分隔的关键字样式名称),根据业务功能命名内容。这些问题我可能可以自己解决,但如果我想系统地使用这些特性,并将它们介绍给一个开发团队,那么有一套形式化的指导原则是有意义的。。。


    [一] -通过询问如何 使用 我并不是真的在问如何使用API(这是非常直接的),我是指一个更一般的层次,即如何设置一致地使用标记的日志记录

    4 回复  |  直到 15 年前
        1
  •  92
  •   user359996    12 年前

    首先,正如@darioo所说:

    • MDC用于将多个事件与几个“实体”关联起来
    • [标记]用于“特殊”事件,您希望将其从常规事件中筛选出来

    所以你要用MDC来做这个的断言。标记用于突出显示“特殊”事件(如果愿意,可以进行筛选),而不是“切片”。例如,可以基于特定用户进行切片,但可以基于任何意外异常进行筛选。在这种情况下,您可以创建 用户 MDC维度和 意外例外 标记。


    但这显然不能解决你心中的问题。你“指的是一个人如何一致地使用标记来设置日志记录的更一般的级别。”所以让我们来说明一下:

    MDC用于 交叉分析 ,标记用于 过滤 . 这些活动在测试和生产过程中进行 . 因此,当测试/生产开始时,您需要决定哪些维度可能有助于对日志数据进行切片,哪些情况下可能有助于对其进行筛选。 每个维度都有一个MDC维度。每个案例都有一个标记。 就这么简单。

    开发者不需要在这里做任何决定。 一个人或一个团队应该决定, 设计时 ,需要支持什么样的切片、切割和过滤。这应该通过想象一个人期望他们执行什么样的分析任务来告知。

    同一个人或团队应该决定命名约定。 完全是武断的 . 选择一些美观的, 自描述的 (最重要的),并且足够具体,不可能与以后的添加相冲突。连字符 与。 下划线是非常挑剔和令人担忧的一点,但请注意,它可能不那么混乱的ESL员工阅读下划线(至少相比于CamelCase);同时,据报道,这惹恼了一些开发人员,因为尴尬地达到了必要的关键。

    就决定一项政策而言,这意味着 定义在哪些情况下需要使用给定的标记或MDC维度 . 保持这一点(集中,深思熟虑),但是如果开发人员觉得维度和标记集不足以完成手头的任务,则允许他们提供反馈。根据需要修改/添加尺寸和/或属性。

    明白 这项政策几乎必然是针对具体项目的 . 不是每个项目都需要相同的日志分析。想象一些噩梦场景。然后想象一下您希望如何能够分析该场景中的日志。您可能不想编写复杂的脚本来尝试跟踪哪个消息属于哪个上下文,哪个状态在哪个时间,对吧?把这些必要的信息编码成维度和标记,如果出了问题,可以省去一些麻烦。

        2
  •  72
  •   darioo    15 年前

    首先,MDC。

    在一个只有一个“实体”与某些行为相关联的环境中,MDC非常有用。一个典型的例子:用户与web应用程序交互。所以,假设你有很多用户在使用你的web应用。使用MDC,您可以轻松地跟踪它们,而无需太多麻烦。简化示例:

    ...[Sandy][abcd] clicked on "change profile"
    ...[Joe][1234] clicked on "weather reports"
    ...[Joe][1234] clicked on "Europe"
    ...[Sandy][abcd] clicked on "logout"
    ...[Joe][1234] clicked on "logout"
    ...[Sandy][efgh] logged in
    

    这里,您在两个地方使用MDC:用户名和会话ID。这样,您就可以轻松地对一个用户的会话进行grep,查看他们一直在做的所有事情。

    第二,标记。

    标记通常用于“特殊”情况,例如向管理员发送电子邮件以发现一些严重的关键错误。并非所有的错误都属于同一类;有些错误必须以适当的方式处理。

    或者,当用户退出您的服务时,它通常会转到一个信息日志,但如果您希望此类事件进入单独的日志文件中,则也可以为此类实例使用标记,这样您可以更容易地监视它,以便统计收集退出的用户。

    经验法则:

    • MDC用于将多个事件与几个“实体”关联起来
    • 标记用于“特殊”事件,您希望将其从常规事件中筛选出来
        3
  •  30
  •   Ceki    13 年前

    标记可用于 颜色 或标记a 单一的 日志语句。你如何处理这些颜色,即标记,完全取决于你。然而,对于标记的使用,两种模式似乎很常见(第一种比第二种更常见)。

    1. 触发 :可以指示某些附加程序在某个标记存在时执行操作。例如, SMTPAppender 可以配置为每当日志记录事件标记为 NOTIFY_ADMIN 不考虑日志级别的标记。见 marker-based triggering 在日志记录文档中。您还可以将日志级别和触发标记结合起来。

    2. 过滤 :例如,可以用颜色“DB”标记所有与持久性相关的日志(在各种和多个类文件中)。然后可以筛选“DB”:禁用日志记录,但标记为DB的日志语句除外。见 chapter on filters 在logback文档中获取更多信息(搜索MarkerFilter)。

        4
  •  7
  •   Mark D    11 年前

    作为一个附录,如果您使用logstash并启用了json日志记录,那么还有一个潜在的Marker用途——用于记录与特定日志消息相关联的变量。这比在消息体中包含它更一致,更容易解析。非常有用,如果它适合您的用例的话。

    请参见此处的详细信息:

    https://github.com/logstash/logstash-logback-encoder#loggingevent_custom_event