在 SLF4J/Logback 中使用标记的最佳做法

2022-08-31 07:46:32

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

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

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

在日志记录中创建和使用标记的最佳做法、约定或策略可能是什么。

更新:我想,我真正追求的不是为什么使用标记,而是如何部分 - 是否有一些命名标记的良好做法(例如,使用带有空格的纯文本或破折号/下划线/标点符号分隔的关键字样式名称),是否应该有某种“标准名称”池,根据业务功能命名东西。这些问题我可能可以自己弄清楚,但是如果我想系统地使用这些功能并将其介绍给开发人员团队,那么围绕...


[1] - 通过询问如何使用标记,我并没有真正询问如何使用API(它真的非常简单) - 我指的是如何设置记录的更一般的水平,即如何使用标记一致地


答案 1

首先,正如@darioo所说:

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

因此,您断言您希望为此使用MDC。标记用于突出显示“特殊”事件(如果您愿意,可以进行筛选),而不是“切片”。例如,您可以根据特定用户进行切片,但会根据任何意外的异常进行筛选。在这种情况下,您将创建一个用户 MDC 维度和一个意外异常标记。


但这显然不能解决您想到的问题。您“指的是更一般的级别,即如何一致地使用标记来设置日志记录。因此,让我们解决这个问题:

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

开发人员不需要在这里做出任何决定。单个人员或团队应在设计时决定需要支持哪种切片、切块和筛选。这应该通过想象人们期望他们可能被要求执行什么样的分析任务来告知。

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

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

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


答案 2

首先是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 用于将多个事件与几个“实体”相关联
  • 标记用于您希望从常规事件中筛选出的“特殊”事件

推荐