Log4j定制JSON格式日志输出

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模板:

{"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();}
}

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

{"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.rhkb.cn/news/15679.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习在癌症分子亚型分类中的应用

学习笔记&#xff1a;机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题&#xff1a;Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊&#xff1a;Cancer Cell发表时间&#xff1a;20…

48V电气架构全面科普和解析:下一代智能电动汽车核心驱动

48V电气架构&#xff1a;下一代智能电动汽车核心驱动 随着全球汽车产业迈入电动化、智能化的新时代&#xff0c;传统12V电气系统逐渐暴露出其无法满足现代高功率需求的不足。在此背景下&#xff0c;48V电气架构应运而生&#xff0c;成为现代电动汽车&#xff08;EV&#xff09…

Mac(m1)本地部署deepseek-R1模型

1. 下载安装ollama 直接下载软件&#xff0c;下载完成之后&#xff0c;安装即可&#xff0c;安装完成之后&#xff0c;命令行中可出现ollama命令 2. 在ollama官网查看需要下载的模型下载命令 1. 在官网查看deepseek对应的模型 2. 选择使用电脑配置的模型 3. copy 对应模型的安…

操作教程丨使用1Panel开源面板快速部署DeepSeek-R1

近期&#xff0c;DeepSeek-R1模型因其在数学推理、代码生成与自然语言推理等方面的优异表现而受到广泛关注。作为能够有效提升生产力的工具&#xff0c;许多个人和企业用户都希望能在本地部署DeepSeek-R1模型。 通过1Panel的应用商店能够简单、快速地在本地部署DeepSeek-R1模型…

免费在腾讯云Cloud Studio部署DeepSeek-R1大模型

2024年2月2日&#xff0c;腾讯云宣布DeepSeek-R1大模型正式支持一键部署至腾讯云HAI&#xff08;高性能应用服务&#xff09;。开发者仅需3分钟即可完成部署并调用模型&#xff0c;大幅简化了传统部署流程中买卡、装驱动、配网络、配存储、装环境、装框架、下载模型等繁琐步骤。…

C语言-结构体

1.共用体: union //联合--共用体 早期的时候&#xff0c;计算机的硬件资源有限&#xff0c; 能不能让多个成员变量 公用同一块空间 //使用方式 类似 结构体 --- 也是构造类型 struct 结构体名 { 成员变量名 }; union 共用体名 { 成员变量名 }; //表示构造了一个共用体…

多头自注意力中的多头作用及相关思考

文章目录 1. num_heads2. pytorch源码演算 1. num_heads 将矩阵的最后一维度进行按照num_heads的方式进行切割矩阵&#xff0c;具体表示如下&#xff1a; 2. pytorch源码演算 pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set…

数据仓库和商务智能:洞察数据,驱动决策

在数据管理的众多领域中&#xff0c;数据仓库和商务智能&#xff08;BI&#xff09;是将数据转化为洞察力、支持决策制定的关键环节。它们通过整合、存储和分析数据&#xff0c;帮助组织更好地理解业务运营&#xff0c;预测市场趋势&#xff0c;从而制定出更明智的战略。今天&a…

C++ ——从C到C++

1、C的学习方法 &#xff08;1&#xff09;C知识点概念内容比较多&#xff0c;需要反复复习 &#xff08;2&#xff09;偏理论&#xff0c;有的内容不理解&#xff0c;可以先背下来&#xff0c;后续可能会理解更深 &#xff08;3&#xff09;学好编程要多练习&#xff0c;简…

半导体制造工艺讲解

目录 一、半导体制造工艺的概述 二、单晶硅片的制造 1.单晶硅的制造 2.晶棒的切割、研磨 3.晶棒的切片、倒角和打磨 4.晶圆的检测和清洗 三、晶圆制造 1.氧化与涂胶 2.光刻与显影 3.刻蚀与脱胶 4.掺杂与退火 5.薄膜沉积、金属化和晶圆减薄 6.MOSFET在晶圆表面的形…

Avnet RFSoC基于maltab得5G 毫米波 开发工具箱

使用 MATLAB 连接到 AMD Zynq™ RFSoC 评估板。使用 RF 附加卡执行 OTA 测试。使用 HDL Coder 部署算法 版本要求&#xff1a; 大于 2023b 需要以下支持包之一&#xff1a; 适用于 Xilinx 基于 Zynq 的无线电&#xff08;R2023b 及更早版本&#xff09;的通信工具箱支持包适…

第三节 docker基础之---Commit+Dockerfile制作

docker目前镜像的制作两种方法&#xff1a; 1&#xff0c;基于docker Commit制作镜像 2&#xff0c;基于dockerfile制作镜像&#xff0c;Dockerfile 为主流的制作方式 如果不制作镜像删除容器之后则里面配置的文件也随之删除&#xff1a; [rootdocker ~]# docker images 查看…

推荐一个免费的、开源的大数据工程学习教程

在当今信息爆炸的时代&#xff0c;每一个企业都会产生大量的数据&#xff0c;而大数据也已经成为很多企业发展的重要驱动力&#xff0c;然而如何有效得处理和分析这些海量的数据&#xff0c;却是一个非常有挑战的技术。 今天推荐一个免费的数据工程教程&#xff0c;带你系统化…

【文档智能多模态】英伟达ECLAIR-端到端的文档布局提取,并集成阅读顺序方法

笔者在前期一个系列分享了各种文档智能相关的技术方法&#xff0c;可以参考《文档智能系列栏目》&#xff0c;涵盖各种常见方法。 下面直接看看这个端到端的文档智能结构化方法&#xff0c;供参考。 方法 一、架构 ECLAIR 采用了一个较大的视觉编码器&#xff08;657M 参数…

解锁Netty:Channel更替与HashMap管理的奇妙联动

个人CSDN博客主页&#xff1a; java之路-CSDN博客 ( 期待您的关注 ) 目录 Netty 的 Channel 机制探秘 HashMap 在 Netty 中的角色 创建新 Channel 时的操作步骤 新 Channel 的创建流程 确定老 Channel 的标识 移除老 Channel 的具体方法 从 HashMap 中移除 关闭和回收老…

小白零基础如何搭建CNN

1.卷积层 在PyTorch中针对卷积操作的对象和使用的场景不同&#xff0c;如有1维卷积、2维卷积、 3维卷积与转置卷积&#xff08;可以简单理解为卷积操作的逆操作&#xff09;&#xff0c;但它们的使用方法比较相似&#xff0c;都可以从torch.nn模块中调用&#xff0c;需要调用的…

12.翻转、对称二叉树,二叉树的深度

反转二叉树 递归写法 很简单 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(rootnullptr)return root;TreeNode* tmp;tmproot->left;root->leftroot->right;root->righttmp;invertTree(root->left);invertTree(root->right);return …

算法之 博弈问题

文章目录 巴什博弈292.Nim 游戏 尼姆博弈斐波那契博弈其他博弈1025.除数博弈 博弈问题&#xff0c;就是双方之间的PK,关注的重点是 谁先&#xff1f;以及A,B各自赢的条件 一般有数学问题&#xff0c;动态规划&#xff0c;搜索进行求解 巴什博弈 下面的这题Nim 游戏&#xff0c;…

Linux 安装 Ollama

1、下载地址 Download Ollama on Linux 2、有网络直接执行 curl -fsSL https://ollama.com/install.sh | sh 命令 3、下载慢的解决方法 1、curl -fsSL https://ollama.com/install.sh -o ollama_install.sh 2、sed -i s|https://ollama.com/download/ollama-linux|https://…

DDR原理详解

DDR原理详解 存储器主要分为只读存储器 ROM 和随机存取存储器 RAM两大类。 ROM&#xff1a;只读存储器 ROM 所存数据&#xff0c;一般是装入整机前事先写好的,整机工作过程中只能读出&#xff0c;ROM所存数据稳定&#xff0c;断电后所存数据也不会改变。 RAM&#xff1a;随机…