问题
我们在我们的项目中使用SLF4J Logback组合已经有一段时间了,并且非常满意它,但是我们的日志记录策略相当简单,使用简单的基于类的记录器并且没有像MDC或Markers这样的花哨的东西。
我想知道的是,社区中是否有人实际使用这些功能以及它们如何用于改进日志记录/过滤。
我特别感兴趣的是在哪里,为什么以及如何使用[1]标记进行记录。他们将我作为一个非常简洁的功能,将语义上下文添加到日志中 - 例如当一个类可能正在处理多个问题时,可以使用任务/关注特定标记来区分日志语句。
在日志记录中创建和使用标记的最佳实践,约定或策略可能是什么。
**更新:**我想,我真正追求的并不是因为使用标记,而是显示部分 - 是否有一些命名标记的好方法(例如使用带空格的明文或短划线/下划线/标点符号分隔的关键字样式名称),应该有一些"标准名称"池,根据业务功能命名。我可以为自己解决的问题,但如果我想系统地使用这些功能并将它们介绍给开发人员团队,那么就可以制定一些可正式的指导方针......
[1] - 通过询问tousemarkers我怎么不真正问如何使用API(这真的很直接) - 我更倾向于指出如何设置使用标记的记录的更一般水平
#1 热门回答(86 赞)
首先,正如@darioo所说:
- MDC用于将多个事件与少数"实体"相关联
- [标记]用于你希望从常规事件中过滤的"特殊"事件
所以你断言你想要使用MDC。标记用于突出"特殊"事件 - 过滤,如果你愿意 - 而不是"切片"。例如,你可能会根据特定用户进行切片,但会根据任何意外异常进行过滤。在这种情况下,你将创建一个UserMDC维度和一个UnexpectedExceptionMarker。
但这显然没有解决你想到的问题。你"更倾向于指出如何使用标记始终如一地设置日志记录的更一般级别。"所以让我们解决这个问题:
MDC是forslicing和切割,而标记是用于过滤的.这些活动是在测试和生产过程中执行的。因此,你需要确定哪些维度可能对切割日志数据有用,以及它可能在哪些情况下当测试/生产到来时,过滤它是有用的.588887848每个维度都有一个MDC维度。每个案例都有一个标记。**就这么简单。
**开发人员不需要在此做出任何决定。**单个人或团队应在设计时决定需要支持哪种切片,切块和过滤。应该通过想象可能要求他们执行哪种分析任务来了解这一点。
同一个人或团队应该决定命名约定.它完全是任意的.选择一些美学上令人愉悦的东西,自我描述性(最重要的),并且具体到不可能与后来的添加冲突。 Hyphensvs.underscores非常挑剔,并且令人担忧地说,但请注意,ESL员工阅读下划线可能不那么令人困惑(至少与CamelCase相比);与此同时,据报道,由于到达必要钥匙的尴尬,这使一些开发人员感到恼火。
至于决定政策,这只是意味着定义在哪种情况下需要使用给定的标记或MDC维度.保持这种紧密(集中,有意),但如果他们感觉到维度和标记不足以完成手头的任务。根据需要修改/添加尺寸和/或属性。
理解这个策略几乎必然是项目特定的.并非每个项目都需要相同类型的日志记录分析。想象一些噩梦般的场景。然后想象一下你希望如何分析该场景中的日志。你可能不希望编写一个复杂的脚本来尝试跟踪哪个消息属于哪个上下文,哪个状态在哪个时间,对吧?将任何此类信息编码为维度和标记,并在出现问题时为自己省去一些麻烦。
#2 热门回答(62 赞)
首先,MDC。
MDC在你拥有一个与某些行为相关联的"实体"的环境中非常有用。典型示例:用户与Web应用程序交互。所以,假设你有很多用户搞乱你的网络应用程序。使用MDC,你可以轻松跟踪它们而不会有太多麻烦。简化示例:
263553859
在这里,你在两个地方使用MDC:用户名和会话ID。通过这种方式,你可以轻松地查看一个用户的会话以查看他们一直在做的所有事情。
第二,标记。
标记通常用于"特殊"情况,例如向管理员发送电子邮件以发现严重的严重错误。并非所有错误都属于同一类别;有些必须以适当的方式处理。
或者,当用户退出你的服务时,它通常会转到INFO日志,但如果你希望此类事件放在单独的日志文件中,你也可以对此类实例使用标记,以便你可以监视它更容易用于退出用户的统计收集。
经验法则:
- MDC用于将多个事件与少数"实体"相关联
- 标记用于你希望从常规事件中过滤的"特殊"事件
#3 热门回答(25 赞)
标记可用于tocoloror标记为单个日志语句。你用这些颜色做什么,即标记,完全取决于你。然而,对于标记使用,两种模式似乎是常见的(第一种比第二种更常见)。
- 触发:可以指示一些appender在某个标记存在的情况下采取行动。例如,可以将SMTPAppender配置为每当使用NOTIFY_ADMIN标记标记日志记录事件时发送电子邮件,而不管日志级别如何。请参阅logback文档中基于标记的触发。你还可以组合日志级别和标记以进行触发。
- 过滤:例如,你可以使用颜色"DB"对所有与持久性相关的日志(在各种和多个类文件中)进行颜色/标记。然后,你可以过滤"DB":禁用日志记录,但标记为DB的日志语句除外。有关更多信息,请参阅logback文档中有关过滤器的章节(搜索MarkerFilter)。