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

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

我想知道的是社区中的任何人实际上是否使用这些function以及如何使用这些function来改进日志logging/过滤。

我特别感兴趣的是在哪里,为什么以及如何使用[1]标记进行采伐。 他们认为我是一个很好的将日志语境添加到日志中的function – 例如,当一个类可能处理多个问题时,可以使用任务/关注特定标记来区分日志语句。

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

更新:我想,我真正追求的不是为什么要使用标记,而是如何使用标记 – 是否有一些命名标记的良好实践(例如,使用带空格或短划线/下划线/标点分隔的关键字样式名称的纯文本),是否应该有一些“标准名称”,根据业务function命名的东西。 我可能为自己弄清楚的问题,但是如果我想系统地使用这些function,并将它们引入开发团队,那么有一些正式的指导方针是有道理的。


[1] – 通过询问如何使用标记,我并不真正问如何使用API​​(这实际上是非常简单的) – 我更倾向于指出如何使用标记一致地logging日志

首先,正如@ darioo所说:

  • MDC用于将多个事件与less数“实体”关联起来
  • [标记]用于“特殊”事件,您想从常规事件中滤除

所以你的断言,你想用这个MDC。 标记是突出“特殊”的事件 – 过滤,如果你愿意 – 而不是“切片”。 例如,您可以基于特定用户进行切片,但是可以基于任何意外的例外进行过滤。 在这种情况下,您将创build一个用户 MDC维度和一个UnexpectedException标记。


但是这显然没有解决你心中的问题。 你“是指更一般的水平,如何一直使用标记设置日志logging”。 所以让我们解决这个问题:

MDC用于切片和切块 ,标记用于过滤这些活动是在testing和生产过程中进行的 。 因此,您需要确定您期望的哪个维度可能对切片日志数据有用,以及在testing/生产出现时,可能需要对其进行过滤。 每个维度都有一个MDC维度。 每个案件得到一个标记。 就这么简单。

开发人员不需要在这里做任何决定。 一个人或一个团队应该在devise时决定需要支持哪种切片,切块和过滤。 这应该通过想象什么样的分析任务可以被要求执行。

同一个人或团队应决定命名约定。 这完全是任意的 。 select一些美观的, 自我描述的 (最重要的),具体到不可能与后来的添加冲突。 连字符下划线之间的差异是非常挑剔和惊人的,但是请注意,ESL员工可能不会读到下划线(至less与CamelCase相比)。 与此同时,据报道,由于达到必要的密钥的尴尬,这使得一些开发商感到懊恼。

就决策而言,这仅仅意味着定义在哪些情况下需要使用给定的标记或MDC维度 。 保持这种紧凑(集中的,谨慎的),但是如果他们觉得这套维度和标记对于手头的任务来说是不够的,那就允许开发者提供反馈意见。 根据需要修改/添加尺寸和/或属性。

理解这个政策几乎必然是项目特定的 。 不是每个项目都需要同样的logging分析。 图片一些噩梦的场景。 然后想象一下,如何能够分析该场景中的日志。 你可能不想写一个复杂的脚本来试图跟踪哪个消息属于哪个上下文,哪个状态是哪个时间的,对吗? 编码任何这样的信息是必要的维度和标记,并保存自己的一些麻烦,如果出现问题。

首先,MDC。

在一个与某些行为相关的“实体”的环境中,MDC非常有用。 一个典型的例子:用户与Web应用程序交互。 所以,假设您有许多用户在使用您的networking应用程序。 使用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一个用户的会话,看看他们一直在做的一切。

其次,标记。

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

或者,当用户退出服务时,通常会转到INFO日志中,但是如果您希望诸如此类的事件进入单独的日志文件,您也可以使用标记来查看这些实例,以便您可以监视它更容易进行用户退出的统计收集。

经验法则:

  • MDC用于将多个事件与less数“实体”关联起来
  • 标记用于“特殊”事件,您想从常规事件中筛选出来

可以使用标记颜色或标记单个日志语句。 你用这些颜色做什么,即标记,完全取决于你。 但是,对于标记使用来说,两种模式似乎是常见的(比第二种更普遍)。

  1. 触发 :有些appender可以被指示在某个标记的存在下采取行动。 例如, SMTPAppender可以configuration为每当使用NOTIFY_ADMIN标记logging事件时发送电子邮件,而不考虑日志级别。 在logback文档中查看基于标记的触发 。 您也可以结合日志级别和标记进行触发。

  2. 过滤 :例如,您可以用“DB”颜色标记所有持久性相关日志(在各种类和多个类文件中)。 然后可以过滤“DB”:禁用日志logging,除了标记为DB的日志语句。 有关更多信息,请参阅logback文档中有关filter的章节 (searchMarkerFilter)。

就像附录一样,如果您使用的是logstash并且启用了json日志logging,Marker还有另一个潜在的用途 – 用于loggingvariables以便与特定的日志消息相关联。 这比将其包含在消息体中更加一致且更易于parsing。 非常有用,如果它适合你的使用情况。

在这里看到细节:

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