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


127

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

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

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

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

更新:我想,我所真正追求的是没有那么多,为什么要使用标记,而是如何的一部分-有命名标志的一些好的做法(例如,使用用空格或破折号/下划线/标点符号分隔的关键字样式名称纯文本),如果有某种“标准名称”池,则根据业务功能命名内容。我可能可以为自己解决一些问题,但是如果我想系统地使用这些功能并将其介绍给一组开发人员,则有一套可形式化的指导原则是有道理的...


[1] -通过询问如何使用标记,我并不是在问如何使用API​​(这确实很简单)-我指的是更一般的水平,即如何设置一致地使用标记进行日志记录

Answers:


98

首先,正如@darioo所说:

  • MDC用于将多个事件与很少的“实体”相关联
  • [标记]用于要从常规事件中过滤掉的“特殊”事件

因此,您断言要为此使用MDC。标记用于突出显示“特殊”事件(如果需要的话),而不是“切片”。例如,您可能基于特定用户进行切片,但基于任何意外异常进行过滤。在这种情况下,您将创建一个用户 MDC维和一个UnexpectedException标记。


但这显然不能解决您所想到的问题。您“更确切地说是指如何更一致地使用标记设置日志记录”。因此,让我们解决:

MDC用于切片和切块,而Mark用于过滤这些活动在测试和生产过程中进行。因此,您需要确定在进行测试/生产时,期望使用哪些维度来切片日志数据,以及在哪些情况下进行过滤是有用的。每个维度都有一个MDC维度。每个案例都有一个标记。就这么简单。

开发人员无需在这里做出任何决定。一个人或一个团队应该在设计时决定需要支持哪种切片,切块和过滤。可以通过设想可能要求他们执行哪种分析任务来告知这一点。

同一个人或团队应决定命名约定。这完全是任意的。选择一种在美学上令人愉悦,具有自我描述性(最重要)且足够具体的东西,以免与以后的添加冲突。连字符下划线在这一点上非常挑剔和令人震惊,但请注意,ESL员工阅读下划线可能会更加混乱(至少与CamelCase相比);同时,据报道,由于无法获得必需的密钥,这使某些开发人员感到烦恼。

就决定策略而言,这仅意味着定义在什么情况下需要使用给定的标记或MDC维度。保持紧密(集中,故意的),但是如果开发人员认为维度和标记集不足以应付当前任务,则可以征求他们的反馈。适当修改/添加尺寸和/或属性。

了解此政策几乎必然是针对特定项目的。并非每个项目都需要相同类型的日志记录分析。想象一些噩梦。然后想象一下您希望如何分析这种情况下的日志。您可能不想编写复杂的脚本来尝试跟踪哪个消息属于哪个上下文以及哪个状态在哪个时间是正确的?对尺寸和标记之类的任何必要信息进行编码,如果出了问题,可以省去一些麻烦。


7
好答案。我认为MDC是基于线程的数据结构,也可以用于过滤。
Ceki 2012年

好答案。但是什么是ESL员工
DerMike'3

谢谢。以英语为第二语言。
user359996

76

首先,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一个用户的会话,以查看他们所做的一切。

第二,标记。

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

或者,当用户退出服务时,通常会转到INFO日志,但是如果您希望此类事件在单独的日志文件中记录,则您也可以为此类实例使用标记,以便对其进行监视更容易统计用户退出的情况。

经验法则:

  • MDC用于将多个事件与很少的“实体”相关联
  • 标记用于您要从常规事件中过滤掉的“特殊”事件

3
这是一个很好的答案,但是它仅涵盖了使用标记的一种可能的用例。我的看法是,日志记录框架功能(如MDC和标记)的存在是为了为以后的日志切片和切片提供更多的元数据(例如您提到的管理电子邮件或单独的日志记录案例)。我想,我当时想的是如何精确地创建标记(应该有一个“标准池”标记,要记住一些命名约定,等等)
Roland Tepp 2010年

3
@Roland:我已经添加了一些示例,但是由于定义上它们是无限的,因此我无法添加所有示例。如果您了解标记的动机和原因,那么使用标记将仅受您的想象力和常识的限制。
darioo 2010年

32

标记可用于为单个 log语句着色或标记。这些颜色(即标记)的处理完全取决于您。但是,标记使用似乎有两种模式(第一种比第二种更常见)。

  1. 触发:可以指示某些附加程序在存在特定标记的情况下采取措施。例如,SMTPAppender可以配置为每当用NOTIFY_ADMIN标记标记日志事件时发送电子邮件,而与日志级别无关。请参阅注销文档中的基于标记的触发。您也可以结合日志级别和标记进行触发。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.