vanishalonenewspringboot进阶

springboot 使用logback按业务进行日志分离

2021-01-25  本文已影响0人  蒹葭残辉

开发中,为了方便日志跟踪,我们可能会需要对日志文件进行分离,比如按模块分离,业务分离等等,方便上线后对问题进行跟踪定位。

对于模块间分离常常比较简单,可以直接需要包路径匹配进行区分。

但实际开发中,我们可能遇到一个问题,就是很多个业务的入口是相同的,此时无法根据包名区分,但还是希望对当前消息的整个处理过程是在单独的业务日志文件中,那么如何处理呢???

这里推荐使用MDC,进行处理。
比如:在消息接收的时候,首先判断下消息的业务类型,再将要写入的文件名放到MDC中。

MDC.put("logFileName","xxxx");

logback配置:

<appender name="INFO" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>logFileName</key>
            <defaultValue>custom</defaultValue>
        </discriminator>
        <sift>
            <appender name="FILE-${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <!-- 按天回滚 daily -->
                    <fileNamePattern>${log_dir}/${logFileName}/log-info-${logFileName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
                    <!-- 日志最大的历史 30天 -->
                    <maxHistory>${maxHistory}</maxHistory>
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <!-- maxFileSize:这是活动文件的大小,默认值是10MB,这里设置为500MB -->
                        <maxFileSize>${maxFileSize}</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                </rollingPolicy>
                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                    <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}| %C.%M | [%thread]|[%X{threadId}] |[%X{traceId}] | %highlight(%-5level) | %boldYellow(%thread) |
                        %boldGreen(%logger) | %msg%n
                    </pattern>
                </encoder>
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <!-- 只打印info日志 -->
                    <level>INFO</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
            </appender>
        </sift>
    </appender>

我们需要考虑当MDC中没有指定logFileName参数时,给出默认值custom。
mdc保存在threadLocal中,所有当前线程整个处理都会输出到指定的log文件中,需要需要注意一点的是,mdc一定要注意清理哦!!在使用完成之后务必进行一次clear.

上一篇下一篇

猜你喜欢

热点阅读