springboot 集成log4j日志,需要自定义json格式内容输出方便ES采集

背景

公司需要将服务迁移到K8S环境上,由于目前服务输出的格式不符合ES进行采集的日志格式,所有需要将日志输出的格式进行调整为JSON格式,方便ES采集

遇到的坑

之前是直接配置的输出格式的message为"message": %msg",但是由于打日志需要打印json内容的日志就没有进行转义导致,整体输出的json格式出错,es采集日志就出问题了

解决方法:调整为"message": %enc{%m}{JSON}"则支持json内容输出

参考官方文档:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

解决方案-正确姿势

log4j log4j2.xml配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
    <properties>
        <property name="log.pattern">
            {"code":"%X{code}", "time":"%d{MM-dd HH:mm:ss.SSS}", "level":"%level", "method":"%X{method}", "header.client-ip":"%X{header.client-ip}", "header.content-length":"%X{header.content-length}", "thread":"%thread", "class":"%logger{35}:%L", "message": %enc{%m}{JSON}", "stack_trace":"%exception{10}"}\n
        </property>
    </properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${log.pattern}"/>
        </Console>
        <RollingRandomAccessFile name="fileLog"
                                 fileName="/home/logs/demo.log"
                                 filePattern="/home/logs/demo.%d{yyyyMMddHH}.log.gz">
            <PatternLayout pattern="${log.pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="data" maxDepth="1">
                    <IfFileName glob="*.log.gz"/>
                    <IfLastModified age="2d"/>
                </Delete>
                <Delete basePath="log" maxDepth="1">
                    <IfFileName glob="*.log.gz"/>
                    <IfLastModified age="2d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLog"/>
        </Root>
        <Logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug"/>
        <Logger name="org.springframework.boot.web.embedded" level="info"/>
    </Loggers>
</Configuration>

定义输出格式

<Properties>
        <property name="log.pattern">
            {"code":"%X{code}", "time":"%d{MM-dd HH:mm:ss.SSS}", "level":"%level", "method":"%X{method}", "header.client-ip":"%X{header.client-ip}", "header.content-length":"%X{header.content-length}", "thread":"%thread", "class":"%logger{35}:%L", "message": %enc{%m}{JSON}", "stack_trace":"%exception{10}"}\n
        </property>
</Properties>

输出格式测试

public class Demo {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args) {
        String name = "xiaoming";
        HashMap<String, Object> infoMap = new HashMap<>(3);
        infoMap.put("age", 18);
        infoMap.put("sex", 1);
        infoMap.put("weight", 60);
        log.info("输出信息 name:{}, userInfo:{}", name, JSONObject.toJSONString(infoMap));
    }
}

输出效果:

{"code":"","time":"07-06 11:50:29.429","level":"INFO ","thread":"main","class":"com.tushu.bt.push.web.Demo:24","message": 输出信息 name:xiaoming, userInfo:{\"weight\":60,\"age\":18,\"sex\":1}","stack_trace":""}

会将之前的json格式进行转义操作

图示

在这里插入图片描述

踩坑

如果不用"message": %enc{%m}{JSON}"进行处理msg内容直接用"message": %msg"`会出现的问题就是,不会将json内容进行转义导致整体输出的json不是一个正常的json

示例调整输出格式:

<Properties>
        <property name="log.pattern">
            {"code":"%X{code}", "time":"%d{MM-dd HH:mm:ss.SSS}", "level":"%level", "method":"%X{method}", "header.client-ip":"%X{header.client-ip}", "header.content-length":"%X{header.content-length}", "thread":"%thread", "class":"%logger{35}:%L", "message": %msg", "stack_trace":"%exception{10}"}\n
        </property>
</Properties>

还是用上面的Demo.java进行输出日志
效果:

{"code":"", "time":"07-06 12:06:53.483", "level":"INFO", "method":"", "header.client-ip":"", "header.content-length":"", "thread":"main", "class":"com.tushu.bt.push.web.Demo:24", "message": 输出信息 name:xiaoming, userInfo:{"weight":60,"age":18,"sex":1}", "stack_trace":""}

在这里插入图片描述

在这里插入图片描述
没有进行对message字段进行特殊字符进行转义操作,导致整体输出的json格式出错!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/36249.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop下载安装(物理机)

1、下载Hadoop安装包## http://archive.apache.org/dist/hadoop/common 2、解压安装Hadoop 将hadoop-2-7.4.tar.gz包上传到/root/export/software目录 cd /root/export/software mkdir /root/exprot/servers tar -zxvf hadoop-2.7.4.tar.gz -C /root/export/servers/3、配置…

保护用户数据隐私:Web3 技术在电商行业中的应用

电商行业一直是全球经济发展的重要推动力。然而&#xff0c;随着电商行业的不断发展&#xff0c;中心化的支付、物流和数据存储方式逐渐暴露出安全隐患和隐私问题。这时&#xff0c;Web3 技术以其去中心化、安全性和透明性等特点&#xff0c;为电商行业带来了新的解决方案和可能…

SQL-每日一题【584.寻找用户推荐人】

题目 给定表 customer &#xff0c;里面保存了所有客户信息和他们的推荐人。 写一个查询语句&#xff0c;返回一个客户列表&#xff0c;列表中客户的推荐人的编号都 不是 2。 对于上面的示例数据&#xff0c;结果为&#xff1a; 解题思路 1.题目要求查询列表中客户的推荐人的…

【Ubuntu学习MySQL——报错 ERROR 2002 (HY000)】

问题&#xff1a; 报错含义&#xff1a; 根据上面的报错&#xff0c;意思是说mysql想使用/var/run/mysqld/mysqld.scok文件&#xff0c;但是无法连接&#xff0c;接下来我们来看看这个文件是否存在 1.查看所有的sock文件 sudo find / -type s 根据上述命令所得出的结果可以知…

线程 线程池

线程和进程的区别? 进程是正在运行程序的实例&#xff0c;进程中包含了线程&#xff0c;每个线程执行不同的任务 不同的进程使用不同的内存空间&#xff0c;在当前进程下的所有线程可以共享内存空间 线程更轻量&#xff0c;线程上下文切换成本一般上要比进程上下文切换低 创…

MySQL - 第11节 - MySQL事务管理

目录 1.事务的概念 2.事务的版本支持 3.事务的提交方式 3.1.查看事务的提交方式 3.2.设置事务的提交方式 4.事务的相关演示 4.1.演示一&#xff1a;证明事务的开始与回滚 4.2.演示二&#xff1a;原子性 4.3.演示三&#xff1a;持久性 4.4.演示四&#xff1a;begin会自…

gitlab【安装部署、备份与恢复】

【1】安装依赖 [rootgit ~]# yum -y install install curl opessh-server postfix wget【2】安装软件包 [rootgit ~]# yum -y localinstall gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm 【3】修改配置 [rootgit ~]# grep "^[a-Z]" /etc/gitlab/gitlab.rb external_ur…

❤️创意网页:生日快乐!穿越奇妙时光的温暖庆祝(HTML+CSS+JS)简单好用

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

基于STM32设计的简易手机

一、项目介绍 基于STM32设计的简易手机可以作为智能手表的模型进行开发&#xff0c;方便老人和儿童佩戴。项目主要是为了解决老年人或儿童使用智能手表时可能遇到的困难&#xff0c;例如操作困难、功能复杂等问题。 在这个项目中&#xff0c;采用了STM32F103RCT6主控芯片和SI…

【mysql】-【锁】

文章目录 概述MySQL并发事务访问相同记录读-读情况写-写情况读-写或写-读情况并发问题的解决方案 锁的不同角度分类 概述 事务的隔离性由这章讲述的锁来实现。 MySQL并发事务访问相同记录 并发事务访问相同记录的情况大致可以划分为3种: 读-读情况 读-读情况&#xff0c;…

科技力量赋予 SK5 代理 HTTP 代理 IP 网络无限可能

第一部分&#xff1a;智能网络加速技术 智能缓存&#xff1a;SK5 代理 HTTP 代理 IP 利用智能缓存技术&#xff0c;将经常访问的资源缓存在代理服务器中&#xff0c;从而实现更快速的资源加载和页面响应。这种智能化的缓存策略有效减少了对远程服务器的依赖&#xff0c;提升了用…

自建个人音乐播放器Navidrome - 内网穿透实现在外随时访问

文章目录 1. 前言2. Navidrome网站搭建2.1 Navidrome下载和安装2.1.1 安装并添加ffmpeg2.1.2下载并配置Navidrome2.1.3 添加Navidrome到系统服务 2.2. Navidrome网页测试 3. 本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4. 公网访问测试5. 结语 转…

Linux学习之vim在光标所在处写入内容,保存退出

vim insertTest使用vim打开一个叫做insertTest新文件。 输入命令之后&#xff0c;按下Enter&#xff08;回车键&#xff09;&#xff0c;就可以进入下边的操作页面。 按i在当前光标位置处&#xff0c;就可以插入内容了。 接下来写入内容跟记事本里边是差不多的。 按一下…

文心一言 VS 讯飞星火 VS chatgpt (57)-- 算法导论6.4 1题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;57&#xff09;-- 算法导论6.4 1题 一、参照图 6-4 的方法&#xff0c;说明 HEAPSORT 在数组 A(5&#xff0c;13&#xff0c;2&#xff0c;25&#xff0c;7&#xff0c;17&#xff0c;20&#xff0c;8&#xff0c;4)上的操作过程…

ChatGPT显示付费墙内容,OpenAI把联网功能关了

ChatGPT 学会上网不到两个月&#xff0c;OpenAI就不能忍了。 本周二&#xff0c;OpenAI 突然宣布停止 ChatGPT 的网络浏览功能「使用 Bing 浏览」。 果不其然&#xff0c;关闭的原因是这项功能遭到了滥用。在周一发布的一篇文章中&#xff0c;OpenAI 支持团队人员表示&#xf…

微调预训练的 NLP 模型

动动发财的小手&#xff0c;点个赞吧&#xff01; 针对任何领域微调预训练 NLP 模型的分步指南 简介 在当今世界&#xff0c;预训练 NLP 模型的可用性极大地简化了使用深度学习技术对文本数据的解释。然而&#xff0c;虽然这些模型在一般任务中表现出色&#xff0c;但它们往往缺…

mac intellij idea配置settings.xml报错解决

今天在配置环境的时候&#xff0c;发现在运行代码的时候不断报错提示maven没有能够成功地被sync&#xff0c;解决方法将以下三点解决了之后&#xff0c;程序最终跑起来了。 1.将maven的版本配置对&#xff0c;之前项目都用的maven-3.8.5这个版本&#xff0c;而我原先用的是mave…

大一下暑期计划 + 2023字节青训营预告直播

目录 &#x1f33c;前言 &#x1f339;后端学习方法 &#x1f333;1&#xff0c;层次 &#x1f333;2&#xff0c;体系 &#x1f333;3&#xff0c;算法和数据结构 &#x1f333;4&#xff0c;总结 &#x1f339;前端学习方法 &#x1f333;基础 &#x1f339;求职中如…

如何在Windows 10中创建引导到UEFI固件设置的快捷方式

大多数计算机都有一个特定的键,当计算机启动时按下该键,用户可以访问UEFI(固件)设置。然而,我们经常在错过给定的时间段时按键太晚,因为笔记本电脑默认情况下只需等待几秒钟就可以启动到 Windows。 另一个引导到 UEFI 设置的选项是重新启动到高级启动选项,然后从那里开…

在linux中安装HAProxy

使用xfrp将压缩包上传到linux的opt目录下 1.解压HAProxy安装包 tar -zxvf haproxy-1.8.12.tar.gz 2. 查看点钱的内核及版本: uname -r 3. 根据内核版本选择编译参数 cd haproxy-1.8.12 cat README 4. 编译安装HAProxy make TARGETlinux2628 ARCHx86_64 PREFIX/usr/local…