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

如何配置Log4j的JsonTemplateLayout与Appender关联输出指定JSON日志

解决Log4j2中JsonTemplateLayout与Console Appender关联问题,输出自定义结构JSON日志

1. 确认依赖配置

JsonTemplateLayout不属于Log4j2核心包,必须单独引入log4j-layout-template-json模块,且版本需与你的Log4j2核心版本完全一致:

Maven依赖

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-layout-template-json</artifactId>
    <version>${log4j2.version}</version>
</dependency>

Gradle依赖

implementation 'org.apache.logging.log4j:log4j-layout-template-json:${log4j2.version}'

2. 正确配置log4j2.xml关联Console Appender与JsonTemplateLayout

在配置文件中给Console Appender指定JsonTemplateLayout,并通过template参数引用你的log_fmt.json模板文件(模板需放在类路径下,比如src/main/resources目录):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <!-- 关联Console Appender与自定义JSON模板布局 -->
        <Console name="Console" target="SYSTEM_OUT">
            <JsonTemplateLayout template="classpath:log_fmt.json" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

若模板不在类根路径,可使用绝对路径指定:

<JsonTemplateLayout template="file:/absolute/path/to/log_fmt.json" />

3. 确保自定义模板log_fmt.json格式合规

模板需符合JsonTemplateLayout的解析规则,示例自定义结构模板:

{
  "log_time": {
    "$resolver": "timestamp",
    "pattern": "yyyy-MM-dd HH:mm:ss.SSS"
  },
  "log_level": {
    "$resolver": "level",
    "field": "name"
  },
  "logger_name": {
    "$resolver": "logger",
    "field": "name"
  },
  "content": {
    "$resolver": "message",
    "stringified": true
  },
  "thread_id": {
    "$resolver": "thread",
    "field": "id"
  }
}

4. 常见问题排查

  • 模板文件未加载:检查template参数路径是否正确,确认模板已被打包到类路径(Maven/Gradle的resources目录文件会自动加入类路径)。
  • 版本冲突:保证log4j-layout-template-json与Log4j2核心、API版本完全一致,避免依赖冲突导致布局加载失败。
  • XML语法错误:检查log4j2.xml的标签闭合、属性拼写是否正确。

5. Java代码验证

使用Log4j2标准API打印日志,示例:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class JsonLogTest {
    private static final Logger logger = LogManager.getLogger(JsonLogTest.class);

    public static void main(String[] args) {
        logger.info("自定义结构JSON日志测试", "附加字段", "测试数据");
    }
}

内容的提问来源于stack exchange,提问作者gph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:10:06