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

Rol*_*epp 118 java logging logback markers slf4j

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

我想知道的是,社区中是否有人实际使用这些功能以及它们如何用于改进日志记录/过滤.

我特别感兴趣的是在哪里,为什么以及如何使用[1]标记进行记录.他们认为这是一个非常简洁的功能,可以在记录中添加语义上下文 - 例如,当一个类可能正在处理多个问题时,可以使用任务/关注特定标记来区分日志语句.

在日志记录中创建和使用标记的最佳实践,约定或策略可能是什么.

更新:我想,我真正追求的不是为什么使用标记,而是如何使用标记- 是否有一些命名标记的好方法(例如使用带空格的明文或短划线/下划线/标点符号分隔的关键字样式名称),是否应该有某种"标准名称"池,根据业务功能命名.我可以为自己解决的问题,但如果我想系统地使用这些功能并将它们介绍给开发人员团队,那么就可以制定一些可正式的指导方针......


[1] - 通过询问如何使用标记我并不是真的问如何使用API​​(它确实非常直接) - 我更倾向于指出如何设置使用标记一致地记录的更一般级别

use*_*996 92

首先,正如@darioo所说:

  • MDC用于将多个事件与少数"实体"相关联
  • [标记]用于您希望从常规事件中过滤的"特殊"事件

所以你断言你想要使用MDC.标记用于突出"特殊"事件 - 过滤,如果你愿意 - 而不是"切片".例如,您可能会根据特定用户进行切片,但会根据任何意外异常进行过滤.在这种情况下,您将创建用户 MDC维度和UnexpectedException标记.


但这显然没有解决你想到的问题.您"更倾向于指出如何使用标记一致地设置日志记录的更一般级别." 所以让我们解决这个问题:

MDC用于切片和切块,而标记用于过滤.这些活动在测试和生产过程中进行.因此,您需要确定哪些维度可能对切割日志数据有用,以及在测试/生产出现时对哪些维度过滤可能有用.每个维度都有一个MDC维度.每个案例都有一个标记.就这么简单.

开发人员不需要在此做出任何决定.单个人或团队应在设计时决定需要支持哪种切片,切片和过滤.应该通过想象可能要求他们执行哪种分析任务来了解这一点.

同一个人或团队应该决定命名约定.这完全是武断的.选择一些美学上令人愉悦,自我描述(最重要)的东西,并且具体到足以与后来添加的东西冲突.连字符下划线非常挑剔并且令人担忧地忽略了这一点,但请注意,ESL员工阅读下划线可能不那么令人困惑(至少与CamelCase相比); 与此同时,据报道,由于到达必要钥匙的尴尬,这使一些开发人员感到恼火.

就决策而言,这仅仅意味着定义在哪些情况下需要使用给定的标记或MDC维度.保持这种紧密(集中,慎重),但如果他们认为维度和标记的集合不足以完成手头的任务,则允许开发人员提供反馈.根据需要修改/添加尺寸和/或属性.

理解这个政策几乎一定是项目特定的.并非每个项目都需要相同类型的日志记录分析.想象一些噩梦的场景.然后想象一下您希望如何分析该场景中的日志.您可能不希望编写一个复杂的脚本来尝试跟踪哪个消息属于哪个上下文,哪个状态是哪个状态,对吧?将任何此类信息编码为维度和标记,并在出现问题时为自己省去一些麻烦.

  • 很好的答案.我认为MDC是一种基于线程的数据结构,也可用于过滤. (7认同)
  • 很好的答案。但什么是_ESL 员工_? (2认同)

dar*_*ioo 71

首先,MDC.

MDC在您拥有一个与某些行为相关联的"实体"的环境中非常有用.典型示例:用户与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
Run Code Online (Sandbox Code Playgroud)

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

第二,标记.

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

或者,当用户退出您的服务时,它通常会转到INFO日志,但如果您希望此类事件放在单独的日志文件中,您也可以对此类实例使用标记,以便您可以监视它更容易用于退出用户的统计收集.

经验法则:

  • MDC用于将多个事件与少数"实体"相关联
  • 标记用于您希望从常规事件中过滤的"特殊"事件

  • 这是一个很好的答案,但它只涵盖了一个使用标记的可能用例.我看到这种方式,存在日志框架功能(如MDC和Markers),以便为日志的后续切片和切割提供更多元数据(例如管理员电子邮件或您提到的单独日志记录案例).我想,我之后是如何创建标记(如果有标准的"标准池",是否有一些命名惯例要记住,等等) (3认同)
  • @Roland:我添加了一些例子,但我不能添加所有的例子,因为根据定义,它们是无限的.如果您了解标记的动机和原因,那么使用它们仅受您的想象力和常识的限制. (2认同)

Cek*_*eki 30

标记可用于着色或标记单个日志语句.你用这些颜色做什么,即标记,完全取决于你.然而,对于标记使用,两种模式似乎是常见的(第一种比第二种更常见).

  1. 触发:可以指示一些appender在某个标记存在的情况下采取行动.例如,SMTPAppender可以配置为每当使用NOTIFY_ADMIN标记标记日志记录事件时发送电子邮件,而不管日志级别如何.请参阅logback文档中基于标记的触发.您还可以组合日志级别和标记以进行触发.

  2. 过滤:例如,您可以使用颜色"DB"对所有与持久性相关的日志(在各种和多个类文件中)进行颜色/标记.然后,您可以过滤"DB":禁用日志记录,但标记为DB的日志语句除外.有关详细信息,请参阅logback文档中有关过滤器章节(搜索MarkerFilter).


Mar*_*k D 7

正如附录一样,如果您正在使用logstash并启用了json日志记录,则Marker还有另一种可能的用途 - 用于记录与特定日志消息关联的变量.这比在消息体中包含它更加一致且更容易解析.非常有用,如果它适合您的用例.

详情请见:

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