Java日志框架中的标记是什么?使用它们的原因是什么?

151

我第一次听到“标记”的概念是在阅读以下内容时:

http://slf4j.org/faq.html

我查看了Logger对象可用的方法:

并发现了以下接口:

我从以下链接中获得了更深入的信息:

但我仍然感到困惑...请注意,我询问的是“为什么”,而不是“如何”使用它们,因此这并不是重复的问题:

更新:似乎当您使用标记时,还需要编写自定义Java代码而不是在XML或.property文件中进行配置...

更新2:来自http://logback.qos.ch/manual/appenders.html#OnMarkerEvaluator

Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
logger.error(notifyAdmin,
  "This is a serious an error requiring the admin's attention",
   new Exception("Just testing"));

要使用标记,您需要使用由SLF4J提供的标记API。这是您所说的“自定义Java代码”吗? - Ceki
@Ceki 看起来仅使用 Logger.warn(Marker, msg) 并没有给您带来任何好处,直到您编写了自定义类用于过滤并注册它们... logback.xml 的普通语法没有特殊的能力来处理 Marker(只能通过 %marker 打印它们)。 - gavenkoa
1
你在 http://logback.qos.ch/manual/appenders.html#OnMarkerEvaluator 所呈现的内容中,发现了什么“特别”的地方? - Ceki
@Ceki 感谢指出!标记符号只能在一个地方使用吗? - gavenkoa
请注意,标记过滤不仅可以由logback执行,还可以由日志分析工具执行。 - Ceki
2
@Ceki,既然我们正在使用Elasticsearch,那么标记特殊事件的方式就是这样。 我们在专用类中保留预定义的标记以供重用。 当您仅对文本日志使用grep时,它并不明显。 - gavenkoa
1个回答

153
这是对问题“在SLF4J/Logback中使用标记的最佳实践”的一个重新梳理版本 我的答案
标记可以用于给单个日志语句进行着色或标记。你可以根据需要使用这些颜色,即标记。然而,标记的使用似乎有两种常见模式。
  1. 触发:某些appender可以在出现特定标记时执行某个操作。例如,SMTPAppender可以配置为在标记有NOTIFY_ADMIN的日志事件出现时发送电子邮件,而不考虑日志级别。请参见logback文档中的基于标记的触发。您还可以组合日志级别和标记进行触发。

  2. 过滤:标记非常有用,可以使某些有价值的日志语句突出显示。例如,您可以使用颜色/标记将所有与持久性相关的日志(在各种多个类文件中)标记为“DB”。然后,您可以过滤"DB":以禁用除标记有DB的日志语句之外的所有日志记录。有关更多信息,请参见logback文档中的过滤器章节(搜索MarkerFilter)。注意,不仅logback可以对标记进行过滤,还可以使用日志分析工具进行过滤。

在引入标记之前,要实现类似的行为,你有两个选择:1)使用自定义级别;2)使用修改后的记录器名称。SLF4J API目前不支持自定义级别。至于第二个选项,如果只需要修改一个或两个记录器,则在记录器名称中添加后缀(或前缀)是可行的。但是,如果需要“子类化”3个或更多记录器,该方法变得不切实际,因为相关的配置文件变得难以管理。
尽管单个标记已经非常有用,但在SLF4J 2.0版本中,每个日志语句可以设置多个标记。

2
也可以在SiftingAppender中用于区分器。https://dev59.com/kYrda4cB1Zd3GeqPTPVx#30552012 - nikli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接