logback使用SiftingAppender、MDC实现日志文件分离,动态指定文件

一、前言

 前期接触到日志的基本配置,能够实现的是大概就是按日志级别输出,日志文件按天、
大小等生成,但有的时候如果把所有日志都放在一个文件里,可能在查看日志时非常不方便,就好比如我想将每个用户的相关操作都保存在对应的日志文件中,这种我们就需要SiftingAppender。

二、SiftingAppender

 顾名思义,SiftingAppender能够在运行中指定的变量,对日志事件进行筛选,由不同的appender去写日志。在logback.xml中的基本格式:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="true">
    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <!--discriminator鉴别器,根据logTag这个key对应的value鉴别日志事件,然后委托给具体appender写日志-->
        <discriminator>
            <key>logTag</key>
            <defaultValue>default</defaultValue>
        </discriminator>
        <sift>
            <!--具体的写日志appender,每一个taskId创建一个文件-->
            <appender name="${logTag}" class="ch.qos.logback.core.FileAppender">
                <file>/log/info-${logTag}.log</file>
                <!--其他省略-->
                ...                
            </appender>
        </sift>
    </appender>

    <logger name="test.log" level="INFO">
        <appender-ref ref="SIFT"/>
    </logger>
</configuration>

 鉴别器discriminator没指定class时,默认为MDCBasedDiscriminator,使用过程中通过MDC指定中的logTag的值,然后中appender就可以引用其值,实现一个动态指定日志输出,也就能达到文件分离的目的,倘若没有指定则会使用中的默认值。

三、示例

1、logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 日志存放路径 -->
    <property name="log.path" value="log/posonline/" />
    <!-- 日志输出格式 -->
    <property name="log.pattern"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} - [%25.25(%thread)] - [%-5level] - %-30.30(%logger{30}) : %msg%n" />

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>


    <!--api接口日志-->
    <appender name="api_appender" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>user_code</key>
            <defaultValue>unknown</defaultValue>
        </discriminator>
        <sift>
            <appender name="${user_code}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${log.path}/biz-info-${user_code}.log</file>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>${log.path}/biz-info-${user_code}.%d{yyyy-MM-dd}.log</fileNamePattern>
                </rollingPolicy>
                <encoder>
                    <pattern>${log.pattern}</pattern>
                </encoder>
            </appender>
        </sift>
    </appender>

    <logger name="com.test.log" additivity="false" level="info">
        <appender-ref ref="api_appender"/>
        <appender-ref ref="console" />
    </logger>

</configuration>
2、代码
package com.test.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class Main {

    static Logger log = LoggerFactory.getLogger("com.test.log");

    public static void main(String[] args) {
        MDC.put("user_code","0001");
        log.info("0001用户");
        MDC.clear(); 

        MDC.put("user_code","0002");
        log.info("0002用户");
        MDC.clear();
    }

}
3、输出

控制台:
在这里插入图片描述
本地日志文件:
在这里插入图片描述

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在 Java使用 Logback 日志记录器并实现日志按天分类压缩保存,你需要进行以下步骤: 1. 在项目中添加 logback 相关依赖,例如: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> ``` 2. 创建 logback.xml 配置文件,并配置日志记录器。以下是一个基本的配置示例: ```xml <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/myapp.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="dailyRollingFileAppender" /> </root> </configuration> ``` 3. 在 Java 代码中使用 Logback 记录日志。例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyClass { private static final Logger logger = LoggerFactory.getLogger(MyClass.class); public void doSomething() { logger.info("This is an info message."); logger.error("This is an error message.", new Exception("Something went wrong.")); } } ``` 以上配置将创建一个名为 `dailyRollingFileAppender` 的日志记录器,它将每天生成一个新的日志文件日志文件名格式为 `logs/myapp.<yyyy-MM-dd>.log.gz`,并在超过 30 天的日志文件后自动删除旧日志日志文件将以 gzip 格式压缩保存。同时,在控制台输出日志信息。可以根据需要调整这些配置项。 希望这些信息能对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值