在SLF4J / Logback中使用标记的最佳实践
我们在项目中使用SLF4J + Logback组合已经有一段时间了,对此我们感到非常满意,但我们的日志记录策略相当简单,使用基于类的直接记录器,并且没有像MDC或Markers这样的花哨的东西。
我想知道的是,如果社区中的任何人实际使用这些功能以及它们如何用于改进日志记录/过滤。
我特别感兴趣的是在哪里,为什么以及如何使用[1]标记进行记录。 他们认为我是一个非常整洁的功能,可以将日志语境添加到日志中 - 例如,当一个类可能处理多个问题时,可以使用任务/关注特定标记来区分日志语句。
什么是在日志中创建和使用标记的最佳实践,惯例或策略。
更新:我想,我真正追求的不是为什么要使用标记,而是如何使用标记 - 是否存在一些命名标记的良好实践(例如,使用带空格或短划线/下划线/标点分隔的关键字样式名称的纯文本),是否应该有某种“标准名称”,根据业务功能命名。 我可能为自己弄明白的问题,但是如果我想系统地使用这些功能并将它们引入开发团队,那么有一些正式的指导方针是有道理的......
[1] - 通过询问如何使用标记,我并不真正问如何使用API(它确实非常简单) - 我更倾向于指出如何使用标记一致地记录日志
首先,正如@ darioo所说:
所以你的断言你想使用MDC来做到这一点。 标记是突出显示“特殊”事件 - 过滤,如果你愿意 - 而不是“切片”。 例如,您可以基于特定用户进行切片,但是可以基于任何意外的例外进行过滤。 在这种情况下,您将创建一个用户MDC维度和一个UnexpectedException标记。
但是这显然没有解决你心中的问题。 你“更多地指的是如何使用标记来持续记录日志。” 所以让我们解决这个问题:
MDC用于切片和切块,标记用于过滤。 这些活动在测试和生产过程中进行 。 因此,您需要确定您期望的哪些维度可能对切片日志数据有用,以及在测试/制作出现时,可能有助于对其进行过滤。 每个维度都有一个MDC维度。 每个案例得到一个标记。 就这么简单。
开发人员无需在此做出任何决定。 单个人或团队应该在设计时决定需要支持哪种切片,切块和过滤。 这应该通过想象什么样的分析任务可以被要求执行。
同一个人或团队应决定命名约定。 这完全是任意的 。 选择美观的, 自描述的 (最重要的),并且具有足够的特性,以便不会与后来的添加相冲突。 连字符与下划线之间的关系非常挑剔和令人担忧,但请注意,ESL员工可能会读出下划线(至少与CamelCase相比)可能会让人困惑。 与此同时,据报道,由于达到必要的密钥的尴尬,这使得一些开发商感到懊恼。
就决策而言,这仅仅意味着定义在哪些情况下需要使用给定的标记或MDC维度 。 保持这种紧密(集中的,谨慎的),但是如果他们觉得这套维度和标记对于手头的任务来说是不够的话,就允许开发人员提供反馈。 根据需要修改/添加尺寸和/或属性。
了解这项政策几乎必定是项目特定的 。 并不是每个项目都需要相同的记录分析。 图片一些噩梦的场景。 然后想象一下,您希望如何分析该场景中的日志。 你可能不想写一个复杂的脚本来试着跟踪哪个消息属于哪个上下文,哪个状态是哪个时间,对吗? 对维度和标记等任何必要的信息进行编码,并在出现问题时节省一些麻烦。
首先,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
在这里,你在两个地方使用MDC:用户名和会话ID。 这样,您可以轻松地grep一个用户的会话,看看他们一直在做的一切。
其次,标记。
标记通常用于“特殊”情况,例如向管理员发送一些严重严重错误的电子邮件。 并非所有的错误总是属于同一类别; 有些必须以适当的方式处理。
或者,当用户退出服务时,通常会转到INFO日志,但如果您希望诸如此类的事件放入单独的日志文件中,您也可以使用标记来查看此类实例,以便您可以监控它更容易进行用户退出的统计收集。
经验法则:
可以使用标记颜色或标记单个日志语句。 你用这些颜色做什么,即标记,完全取决于你。 然而,对于标记使用来说,两种模式似乎很常见(第一种比第二种更普遍)。
触发 :可以指示某个appender在某个标记的存在下采取行动。 例如,无论日志级别如何,只要使用NOTIFY_ADMIN
标记标记日志记录事件, SMTPAppender
可以将SMTPAppender
配置为发送电子邮件。 在logback文档中查看基于标记的触发。 您还可以结合日志级别和标记进行触发。
过滤 :例如,您可以使用颜色“DB”对所有持久性相关日志(在各种类和多个类文件中)进行颜色/标记。 然后,您可以过滤“DB”:禁用日志记录,除了标有数据库的日志语句。 有关更多信息,请参阅logback文档中关于过滤器的章节(搜索MarkerFilter)。