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

news2024/11/19 13:31:21

背景

公司需要将服务迁移到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格式出错!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录一下,linux安装环境步骤。

前文 鉴于之前都是下载压缩包方式安装环境&#xff0c;学习了docker之后&#xff0c;决定将服务器初始化&#xff0c;重新用docker安装相应环境 条件&#xff1a;自己买的阿里云centos系统。单核系统&#xff0c;仅学习使用。 初始化云盘 初始化云盘步骤&#xff1a; 1&…

Perfetto 命令行工具(Android 10 及更高版本)

Perfetto 命令行工具&#xff08;Android 10 及更高版本&#xff09; 1、快速入门1.1 启动跟踪服务1.2 记录跟踪1.2.1 通过 Perfetto UI 记录跟踪1.2.2 通过 cmdline 记录跟踪1.2.3 System Tracing 的系统级应用抓取 2、perfetto 工具2.1 数据源选择2.2 语法参数2.2.1 轻量模式…

数据结构--树和二叉树

目录 1.树的结构及概念1.1树的概念1.2树的相关概念1.3树的表示1.4树在实际中的运用&#xff08;表示文件系统的目录结构&#xff09; 2.二叉树的相关概念2.1概念2.2现实版的二叉树2.3特殊的二叉树2.4二叉树的性质2.5二叉树的存储结构 3.与二叉树有关的习题总结 1.树的结构及概念…

RabbitMQ系列(14)--Topics交换机的简介与实现

1、Topics交换机的介绍 Topics交换机能让消息只发送往绑定了指定routingkey的队列中去&#xff0c;不同于Direct交换机的是&#xff0c;Topics能把一个消息往多个不同的队列发送&#xff1b;Topics交换机的routingkey不能随意写&#xff0c;必须是一个单词列表&#xff0c;并以…

leetcode极速复习版-第三章哈希表

目录 哈希表 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 哈希表 哈希表理论基础 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断一个元素是否出…

机器人制作开源方案 | 卧式车床模型概述

1. 功能说明 本文示例将通过程序控制模拟车床的运动效果--模拟车床进行加工时各个结构的运动方式。车床的主要运动包括夹持工件主轴的旋转运动、刀具进给运动、刀具的换刀旋转运动、溜板的平动、尾座上顶针的进给运动。 2. 结构说明 该车床主轴旋转运动选择带传动的传动方式&am…

Elasticsearch实战(二十四)---ES数据建模一对多模型Nested结构

Elasticsearch实战—ES数据建模一对多模型Nested结构 文章目录 Elasticsearch实战---ES数据建模一对多模型Nested结构1.ES 一对多模型Nested 结构模型实战2.ES字段查询2.1 非Nested 错误结构及错误查询2.2 Nested结构&#xff0c;正确查询 3.Nested结构原理 我们如何把Mysql的模…

vue 中使用 vxe-table 制作可编辑表格

项目上有一个表格需要实现在线编辑&#xff0c;开始用了 element 的el-table 实现&#xff0c;单元格内基础情况就是监听了单击单元格切换一个span标签与input标签&#xff0c;复杂点的单元格使用了大量的条件判断来实现对应的编辑操作&#xff0c;比如下拉选&#xff0c;popov…

github Couldn‘t connect to server

Couldnt connect to server 问题描述解决git clone 出错直接访问github没啥问题ping github.com手动指定域名映射关系再次测试git命令 总结参考 问题描述 前一天还是好好的&#xff0c;能git pull和git push&#xff0c;昨天回来之后怎么操作都是Couldnt connect to server。百…

【数据结构】堆的实现(向下调整和向上调整法)和堆排序的实现

目录 一、堆的概念引入 二、小堆的实现 首先&#xff0c;我们会跟线性表一样建立一个动态数组来存堆的数据 ①、堆的初始化--HeapInit ②、小堆的向下调整法的实现 ③、堆排序的实现 ④、堆的插入和向上调整法 ⑤、删除堆顶数据 ⑥、获取堆顶 三、时间复杂度总结&#…

C# PaddleInference OCR识别 学习研究Demo

说明 基于开源项目 https://github.com/sdcb/PaddleSharp VS2022.net4.8 OpenCvSharp4Sdcb.PaddleInference 效果 项目 代码 using Sdcb.PaddleInference.Native; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using OpenCvSharp.Extensi…

15年前的手机并没有jvm虚拟机,为何可以运行Java游戏

2000年代初期&#xff0c;随着移动通信技术的发展&#xff0c;手机逐渐普及。那个时代的手机功能相对比较单一&#xff0c;主要用于打电话和发送短信。但是&#xff0c;随着技术的进步&#xff0c;人们开始在手机上玩游戏&#xff0c;而其中最受欢迎的游戏就是Java游戏。在那个…

ChatLaw,开源了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 最近这段时间&#xff0c;AI 的整体热度有所下降&#xff0c;但是 AI 技术在各行各业的探索脚步&#xff0c;却一直没有停止。 在 ChatGPT 刚发布时&#xff0c;有不少业内人士认为&#x…

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别 以前不太注意这些&#xff0c;最近搞文档比较多才发现为何保存的一部分PDF文件里面字体可以复制可以搜索&#xff0c;一部分保存的PDF里面的字体却无法复制、无法搜索等&#xff0c;发现是不同保存方式得到的文档权限不一…

SQL注入攻击原理 实战

我来进行实战了&#xff0c;总在看教程。 文章目录 前言一&#xff0c;网站是否存在sql漏洞二、判断一下字段3. 判断显点4.查找相关信息1.查询数据库2.版本3.数据库表名4.字段名5,查询 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 前言&#xff…

华为OD机试真题 Python 实现【学校的位置】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 为了解决新学期学生暴涨的问题&#xff0c;小乐村要建所新学校。考虑到学生上学安全问题&#xff0c;需要所有学生家到学校距离最短。假设学校和所有的学生家&am…

unity+pico neo3入门教程1-基础传送

tips&#xff1a;之前入门教程如果没有左手柄&#xff0c;查看一下自己的手柄设置&#xff0c;左右手柄&#xff0c; Helloworld型 1.基础传送&#xff0c;调式地面传送功能&#xff0c;通过手柄默认的“握手键”&#xff0c;瞬移&#xff0c; VR头显&#xff0c;添加Teleport…

Go语言远程调试

Go语言远程调试 1、安装dlv # 安装dlv $ go install github.com/go-delve/delve/cmd/dlvlatest$ dlv version Delve Debugger Version: 1.20.1 Build: $Id: 96e65b6c615845d42e0e31d903f6475b0e4ece6e $2、命令行远程调试 我们远程(Linux服务器)有如下代码&#xff1a; [ro…

(四)Kafka 消费者

文章目录 1. Kafka 消费者相关概念消费者和消费者组&#xff08;1&#xff09;横向伸缩消费者&#xff08;2&#xff09;横向伸缩消费者组 分区再平衡再均衡的类型&#xff08;1&#xff09;主动再均衡&#xff08;2&#xff09;协作再均衡&#xff08;增量再均衡&#xff09; …

MyBatisAnnotationSqlInjection.ql学习

源码位置 java\ql\src\experimental\Security\CWE\CWE-089 源代码 /*** name SQL injection in MyBatis annotation* description Constructing a dynamic SQL statement with input that comes from an* untrusted source could allow an attacker to modify …