如何配置log4j输出日志级别数字值而非字符串
我正在使用jboss-logging-3.4.2.Final搭配log4j(版本为org.apache.log4j:1.2.16、org.apache.logging.log4j:2.11.2)。当前日志格式如下:
2022-10-07 16:38:27,819 INFO [org.apache.activemq.artemis.core.server] AMQ221034: Waiting indefinitely to obtain live lock
但我需要日志级别的整数值(如INFO对应的数值,以便fluentbit处理),期望格式为:
2022-10-07 16:38:27,819 X [org.apache.activemq.artemis.core.server] AMQ221034: Waiting indefinitely to obtain live lock
当前格式化模式为:formatter.PATTERN.pattern=%d %-5p [%c] %s%E%n。请问能否通过格式化模式配置实现?或者是否有其他可用的日志工具?
针对不同Log4j版本的配置方案
Log4j 2.11.2(新版)
Log4j 2.x的PatternLayout原生支持输出日志级别的整数值,直接修改格式化模式即可:
将原pattern中的%-5p替换为%level{int},新的配置为:
formatter.PATTERN.pattern=%d %level{int} [%c] %s%E%n
输出示例:2022-10-07 16:38:27,819 200 [org.apache.activemq.artemis.core.server] AMQ221034: Waiting indefinitely to obtain live lock
(级别对应数值:TRACE=50, DEBUG=100, INFO=200, WARN=300, ERROR=400, FATAL=500)
Log4j 1.2.16(旧版)
Log4j 1.x的原生PatternLayout没有直接输出级别数值的占位符,需要自定义实现:
- 自定义
PatternConverter:继承org.apache.log4j.helpers.PatternConverter,重写convert(LoggingEvent event)方法,返回event.getLevel().getIntLevel()的字符串形式。 - 扩展
PatternLayout:注册自定义的Converter,指定一个占位符(比如%Lnum)。 - 修改配置:用自定义占位符替换原配置中的
%-5p。
关于jboss-logging的说明
jboss-logging作为日志门面,仅负责日志的桥接转发,最终的格式化由底层的Log4j实现处理,所以只需调整Log4j的配置即可,无需修改jboss-logging的设置。
替代方案
- Logback:作为Log4j的替代日志实现,其PatternLayout支持通过表达式直接输出级别数值,例如
%level(%level.toInt()),配置更灵活。 - Fluent Bit端处理:无需修改应用日志格式,在Fluent Bit中通过过滤器转换级别字符串为数值:
- 使用Lua过滤器编写匹配逻辑,将"INFO"替换为200,"ERROR"替换为400等;
- 使用Modify过滤器配合条件判断实现字符串到数值的映射。
内容的提问来源于stack exchange,提问作者Cat

