You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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没有直接输出级别数值的占位符,需要自定义实现:

  1. 自定义PatternConverter:继承org.apache.log4j.helpers.PatternConverter,重写convert(LoggingEvent event)方法,返回event.getLevel().getIntLevel()的字符串形式。
  2. 扩展PatternLayout:注册自定义的Converter,指定一个占位符(比如%Lnum)。
  3. 修改配置:用自定义占位符替换原配置中的%-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:20:34