【经验总结】Springboot打印指定类的日志到指定文件中

news/2024/7/8 7:40:48 标签: spring boot, logback

原文地址:https://www.cnblogs.com/zeng1994/p/f9bff238b13a0bf8fb8bf88c41db7a34.html
以下内容已经过实践,勘误,总结
环境:Springboot2.5.2

公司有个项目,需要和几个第三方系统对接。这种项目,日志一定要记录详细,不然出了问题就是各种甩锅。虽然项目里面和第三方系统对接相关的业务记录的日志很详细,但是由于整个项目的日志都在一个文件中,排查问题时比较麻烦。因此希望可以把这些和第三方对接的日志生成在另外一个单独的文件。这也就是标题中的实现按业务输出日志到不同的文件,下面开始讲解具体的实现方案。

一、方案

由于需要按业务生成不同的日志文件,看到按业务来区分,我的第一感觉就是业务其实是可以按包名来区分的。所以其实我们只要实现不同的包下面的日志输出到不同的文件,就能实现需求了。由于本人以前玩过log4j2,要实现这个还是不难的,所以马上就有思路了。

具体的实现思路如下:
(1)自定义一个输出到文件的appender(理解为日志输出器)
(2)配置logger,logger的name为需要单独生成文件的那个包的全包名,然后在里面引用上面定义的appender

二、具体实现

(1)准备阶段
由于项目采用SpringBoot框架,而且使用的是默认日志框架logback。看了下官网,只需要在resources下面定义一个logback-spring.xml的XML文件就能覆盖默认的logback配置。
由于SpringBoot默认的日志配置还是挺不错的,因此想把默认的配置保留下来。通过查看springboot的jar包才找到默认的logback的xml配置。
它的位置为spring-boot-2.1.0.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml,这个默认xml中有如下配置:
定义了2个appender,分别为输出到控制台的appender和输出到文件的appender
默认日志级别为info,默认引用了上面定义的这个2个appender
(2)实战阶段
在resources目录下新建一个logback-spring.xml的文件
logback的默认配置(base.xml)内容copy到我们的xml文件中,因为我们想保留它的默认配置
定义一个输出到文件的appender
定义一个logger,logger的name为需要单独生成文件的那个包的全包名
logger里面引用我们上面定义的appender
这里特别说明,自定义logger是属于局部配置,它的优先级高于全局配置(指root),可以理解为局部配置覆盖全局配置。

代码如下

logback-spring.xml内容具体如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--官方配置 start-->
    <!--保留官方配置,方便使用官方配置的特性,参考:spring-boot-2.1.0.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml-->

    <!--<included>-->
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
        <include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    <!--</included>-->
    <!--官方配置 end-->

    <!--######自定义配置  start########-->

    <!-- 自定义配置__单独输出到一个日志文件中 -->

    <appender name="Biz_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <encoder>

            <pattern>${FILE_LOG_PATTERN}</pattern>

        </encoder>

        <file>${LOG_FILE}_BIZ.log</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

            <fileNamePattern>${LOG_FILE}_BIZ.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>

            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>

            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>

        </rollingPolicy>

    </appender>


    <!--指定包或者类的日志配置(这里是局部配置,它能覆盖全局配置)-->
    <!-- 自定义配置__配置业务日志输出至单独的日志文件中 -->

    <logger name="com.huicoo.forestry.resources.manager.ImportManager" additivity="false" level="debug">

        <!-- 引用自定义的appender -->

        <appender-ref ref="Biz_LOG"/>

        <!-- 这里也引用控制台appender,才能在控制台中看到我们的日志 -->

        <appender-ref ref="CONSOLE"/>

    </logger>

    <!--######自定义配置  end########-->
</configuration>

最终实现日志单独打印到指定的_biz.log文件中


http://www.niftyadmin.cn/n/5536860.html

相关文章

C++ | Leetcode C++题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:string shortestPalindrome(string s) {int n s.size();vector<int> fail(n, -1);for (int i 1; i < n; i) {int j fail[i - 1];while (j ! -1 && s[j 1] ! s[i]) {j fail[j];}if (s[j 1] …

Vbus 和 Vbat

在嵌入式系统开发中&#xff0c;Vbus 和 Vbat 是两个不同的电源相关术语&#xff0c;它们的区别主要在于它们的用途和连接的电源类型。 Vbus 定义: Vbus 通常是指 USB 总线电压。在 USB 2.0 中&#xff0c;Vbus 通常为 5V 电源。用途: Vbus 提供电源给 USB 设备&#xff0c;确…

3.用户程序与驱动交互

驱动程序请使用第二章https://blog.csdn.net/chenhequanlalala/article/details/140034424 用户app与驱动交互最常见的做法是insmod驱动后&#xff0c;生成一个设备节点&#xff0c;app通过open&#xff0c;read等系统调用去操作这个设备节点&#xff0c;这里先用mknode命令调…

arm_uart4实验

#include "uart4.h" //UART //初始化 void hal_uart4_init() { //rcc_init //…

C#的多线程UI窗体控件显示方案

在C#中&#xff0c;特别是在使用Windows窗体&#xff08;WinForms&#xff09;或WPF&#xff08;Windows Presentation Foundation&#xff09;进行UI开发时&#xff0c;处理多线程与UI控件的交互需要特别小心。由于UI控件不是线程安全的&#xff0c;直接从非UI线程&#xff08…

VS Code解释及快捷键

一、VS Code Visual Studio Code&#xff08;简称 VS Code&#xff09;是由微软开发的一款免费、开源的代码编辑器。它具有丰富的功能和扩展性&#xff0c;广泛应用于各种编程语言的开发环境。以下是对 VS Code 的详细介绍&#xff1a; 主要特性 1. 跨平台 VS Code 支持 Wi…

人员定位系统方案的定制,主要明确的系统功能有哪几部分?

人员定位系统对于安全监管和工作效率有很大的帮助&#xff0c;现在&#xff0c;不同领域也开始定制了专门的人员定位系统方案&#xff0c;那么&#xff0c;这一系统在定制之前&#xff0c;需要明确的系统功能主要包含了哪些部分呢? 一、首先是人员的精确定位功能 需要做到精…

java解析请求的字符串参数Content-Disposition: form-data;和拼接的键值对

项目场景&#xff1a; 获取到http请求的参数&#xff0c;已经被字符串接收了&#xff0c;需求是需要从字符串中解析出来。 一种情况是&#xff1a;Content-Disposition: form-data; name"userCode" 另一种是&#xff1a;key1value1&key2value2&key3value3…