Log4j定制JSON格式日志输出

news/2025/2/11 5:36:11/

1.前言

log4j是Java中一个强大的日志记录框架,通过简单的配置便可以在程序中进行日志打印与记录。关于log4j博主最近碰到一个需求,需要将程序运行过程中的日志按给定的json模板输出,本文记录一下log4j如何配置json格式的日志打印。

2.日志配置

2.1依赖配置

本文使用的是log4j 2.x版本,log4j的核心为log4j API( 接口)和log4j Core(实现),它可以通过桥接器log4j-slf4j-impl兼容其他的日志框架如SLF4J等。另外,由于需要支持json日志输出,需要引入log4j-layout-template-json

根据以上说明,下面给出具体maven的依赖:

  <dependencies><dependency><!-- SLF4J API --><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.22</version></dependency><!-- Log4j 2 API --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.17.2</version></dependency><!-- Log4j 2 Core --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.2</version></dependency><!-- SLF4J to Log4j 2 Bridge --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.17.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-layout-template-json</artifactId><version>2.17.2</version></dependency></dependencies>

2.2日志行为设置

通过log4j2.xml来配置日志打印的行为,为了使用json格式来输出和保存日志,使用了JsonTemplateLayout,该布局可以通过eventTemplate[Uri]stackTraceElementTemplate[Uri]来自定义json的结构。

<!--log4j2.xml配置内容-->
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn"><Properties><property name="LOG_HOME">log</property><property name="MAX_SIZE">100MB</property></Properties><Appenders><!--控制台输出--><Console name="Console" target="SYSTEM_OUT"><!-- 使用 JsonTemplateLayout 输出日志 --><JsonTemplateLayout eventTemplateUri="classpath:template.json"/></Console><!--文件输出--><RollingFile name="File" fileName="log/res.log" filePattern="log/res-%d{yyyy-MM-dd}-%i.log"><!-- 使用 JsonTemplateLayout 输出日志 --><JsonTemplateLayout eventTemplateUri="classpath:template.json"/><!-- 定义滚动策略 --><Policies><!--日志文件超过了设定的大小, 会触发日志文件的滚动, 根据filePattern创建新的日志文件--><!--旧的日志文件会附加编号,例如res-1.log, res-2.log--><SizeBasedTriggeringPolicy size="${MAX_SIZE}"/></Policies><!--限制只保留最近的5个日志文件--><DefaultRolloverStrategy max="5" fileIndex="min"/></RollingFile></Appenders><Loggers><Root level="debug"><AppenderRef ref="Console"/><AppenderRef ref="File"/></Root></Loggers>
</Configuration>

JSON模板

log4j官方给出了自定义的模板JsonLayout.json,参考该配置,本文简单定义了如下的template.json模板:

json">{"Thread": {"$resolver": "thread","field": "name"},"ErrorCode": "${ctx:ErrorCode}","Timestamp": "${date:yyyy-MM-dd HH:mm:ss}","Message": {"$resolver": "message","stringified": true},"Thrown": {"message": {"$resolver": "exception","field": "message"},"name": {"$resolver": "exception","field": "className"},"extendedStackTrace": {"$resolver": "exception","field": "stackTrace"}}
}

说明:

  • 模板中的{ "$resolver": "message", "stringified": true }由由 JSON 模板布局编译器解释,并替换为引用的事件或堆栈跟踪模板解析器。
  • 通过ThreadContext可以往json模板动态传值,例如模板中的${ctx:ErrorCode}

3.日志测试

根据上面的配置,定义一个测试类进行日志打印测试:

package com.example.log;import org.apache.logging.log4j.ThreadContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class TraceLogTest {static Logger log =  LoggerFactory.getLogger(TraceLogTest.class);public static void main(String[] args) {// 设置上下文变量ThreadContext.put("ErrorCode", "1024");// 记录日志try{int i = 1 / 0;}catch (Exception e){log.error("Log test", e);}// 清除上下文变量ThreadContext.clearAll();}
}

运行上述代码的记录的日志(格式化后)如下:

json">{"Thread": "main","ErrorCode": "1024","Timestamp": "2025-02-10 14:35:27","Message": "Log test","Thrown": {"message": "/ by zero","name": "java.lang.ArithmeticException","extendedStackTrace": [{"class": "com.example.log.TraceLogTest","method": "main","file": "TraceLogTest.java","line": 15}]}
}

http://www.ppmy.cn/news/1571076.html

相关文章

【AI】在Ubuntu中使用docker对DeepSeek的部署与使用

这篇文章前言是我基于部署好的deepseek-r1:8b模型跑出来的 关于部署DeepSeek的前言与介绍 在当今快速发展的技术环境中&#xff0c;有效地利用机器学习工具来解决问题变得越来越重要。今天&#xff0c;我将引入一个名为DeepSeek 的工具&#xff0c;它作为一种强大的搜索引擎&a…

B+树原理详解及C语言实现

目录 B树的原理 B树的操作过程&#xff08;图形化演示&#xff09; B树的应用场景 B树与B树的对比 C语言实现及应用实例 文件结构 总结 B树的原理 B树是B树的一种变体&#xff0c;广泛应用于数据库和文件系统中。其原理和特点如下&#xff1a; 数据结构&#xff1a;B树…

练习题(2.10)

问题描述 有一个 SNS 被 NN 个用户使用&#xff0c;他们的编号从 11 到 NN。 在这个 SNS 中&#xff0c;两个用户可以成为朋友。 友谊是双向的&#xff1b;如果用户 X 是用户 Y 的朋友&#xff0c;那么用户 Y 也一定是用户 X 的朋友。 目前&#xff0c;在 SNS 上有 MM 对朋…

java-list深入理解(流程图)

List源码学习: 此篇文章使用流程图和源码方式,理解List的源码,方便记忆 核心逻辑流程图: #mermaid-svg-BBrPrDuqUdLMtHvj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BBrPrDuqUdLMtHvj .error-icon{fill:#…

数据结构——红黑树的实现

目录 1 红黑树的概念 1.1 红黑树的规则 1.2 红黑树是如何确保最长路径不超过最短路径的2倍的&#xff1f; 1.3 红黑树的效率 2 红黑树的实现 2.1 红黑树的结构 2.2 红黑树的插入 2.2.1 红黑树插入节点的大概过程 2.2.2 情况1&#xff1a;只变色&#xff0c;不旋转 2.2.3 情况…

TCP三次握手全方面详解

文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值&#xff0c;以及acknum的功能(3) 三次握手中的半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;ACCEPT队列&#xff09;半连接队列全连接队…

清除el-table选中状态 clearSelection

如何在Vue应用中使用Element UI的el-table组件&#xff0c;通过this.$refs.multipleTable.clearSelection()方法来清除所有选中行的状态。适合前端开发者了解表格组件的交互操作。 // el-table绑定ref<el-table selection-change"selsChange" ref"multipl…

2024最新版Java面试题及答案,【来自于各大厂】

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全~ 篇幅限制就只能给大家展示小册部分内容了&#xff0c;需要完整版的及Java面试宝典小伙伴点赞转发&#xff0c;关注我后在【翻到最下方&#xff0c;文尾点击名片】即可免费获取…