如何配置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
相关产品推荐
相关产品推荐

