如何独立于设置的日志级别在 log4j2 中记录消息

问题描述

无论我的记录器设置为哪个级别,我都想记录一条消息,除非级别为 OFF。我的理解是以下内容会做到这一点。

logger.log(Level.ALL,<log message>);

但是这不起作用,除非我在配置文件中将我的根记录器级别设置为 all。我不想将记录器配置级别设置为全部,因为我不想调试,日志中的信息消息。

其他选项是写 logger.trace()logger.fatal()。然而,它们在语义上是错误的,因为它们会被标记为“TRACE”或“FATAL”。

所以,我的问题是 (1) 如何正确地做到这一点以及 (2) 在代码中使用 Level.ALL 的正确用例是什么?

解决方法

Level.ALL 不能用作单个日志事件的级别。它只能在过滤事件时使用。 (它的实际值是 Integer.MAX_VALUE,表示比 TRACE (600) 级别。)

Log4j2 允许您定义自定义日志级别;见https://logging.apache.org/log4j/2.x/manual/customloglevels.html

所以你可以做的是定义一个比FATAL (100) 更高级别的日志级别:

 final Level UNSUPPRESSABLE = Level.forName("UNSUPPRESSABLE",1);

默认情况下,级别名称是日志格式化程序输出的名称,但您可以配置模式以输出不同的内容。请参阅 %level 模式的规范。


然而......我认为在应用程序中做这种事情是一个坏主意。这是意料之外的。它还剥夺了客户控制日志记录的能力。对于客户来说,这些事件真的FATAL更重要吗?由您来为客户打电话吗?

(在这种情况下,“客户”可能是管理您的生产服务器的人。或者,如果您目前对此负责,他们可能是您的继任者:当您被众所周知的绿色打击时接管的人上班路上的公交车。)