1. 程式人生 > 其它 >日誌列印TraceId,一棧查log

日誌列印TraceId,一棧查log

技術標籤:javalogbackslf4j

1、在springBoot啟動類上加上@ServletComponentScan
在這裡插入圖片描述

2、新增filter類LogTraceFilter.java,其中Tid的生成規則可按需修改。

package com.xxx.xxx.xxx.provider.common.filter;

import cn.com.xxx.xxx.core.commons.utils.CommonIdGenerator;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;

import javax.servlet.
*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * 日誌traceId新增 * Created by xxx on 2020/11/26 12:11 */ @Slf4j @WebFilter(filterName = "logTraceFilter", urlPatterns = "/*") public class LogTraceFilter implements Filter { private static final String TRACE_ID =
"traceRootId"; @Override public void init(FilterConfig filterConfig) { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { boolean bInsertMDC = insertMDC
(); try { filterChain.doFilter(servletRequest, servletResponse); } finally { if (bInsertMDC) { MDC.remove(TRACE_ID); } } } @Override public void destroy() { } private boolean insertMDC() { String traceRootId = String.valueOf(CommonIdGenerator.generatId()); MDC.put(TRACE_ID, traceRootId); return true; } }

3、日誌配置檔案logback.xml中加上[%X{traceRootId}]
在這裡插入圖片描述
程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--日誌加密處理-->
<!--    <conversionRule conversionWord="msg" converterClass="com.xxx.xxx.commons.logfilter.FilterSensitiveInforConverter"></conversionRule>-->

    <property name="logPath" value="/home/worker/logs/xxxxx"/>
    <property name="logName" value="xxxxxx"/>

    <appender class="ch.qos.logback.core.ConsoleAppender" name="STDOUT">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%-40.36logger{40}:%-4.4line] [%X{traceRootId}] - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 日誌檔案 appender定義 -->
    <appender class="ch.qos.logback.core.rolling.RollingFileAppender"
      name="infoAppender">

        <File>${logPath}/${logName}_info.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${logPath}/history/%d{yyyy-MM,aux}/%d{yyyy-MM-dd}.${logName}_info.log
            </fileNamePattern>
            <maxHistory>90</maxHistory>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>

        <encoder>
            <charset>UTF-8</charset>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%-40.36logger{40}:%-4.4line] [%X{traceRootId}] - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- error日誌 -->
    <appender class="ch.qos.logback.core.rolling.RollingFileAppender"
      name="errorAppender">
        <File>${logPath}/${logName}_error.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${logPath}/history/%d{yyyy-MM,aux}/%d{yyyy-MM-dd}.${logName}_error.log
            </FileNamePattern>
            <maxHistory>90</maxHistory>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <charset>UTF-8</charset>
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%-40.36logger{40}:%-4.4line] [%X{traceRootId}] - %msg%n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 只打印錯誤日誌 -->
            <level>WARN</level>
        </filter>
    </appender>


    <logger additivity="false" name="com.xxxxx">
        <level value="DEBUG"/>
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="errorAppender"/>
        <appender-ref ref="STDOUT"/>
    </logger>
    <logger additivity="false" name="org.springframework">
        <level value="ERROR"/>
        <appender-ref ref="errorAppender"/>
    </logger>


    <!--myibatis log configure -->
    <logger level="DEBUG" name="java.sql.Connection"/>
    <logger level="DEBUG" name="java.sql.Statement"/>
    <logger level="DEBUG" name="java.sql.PreparedStatement"/>
    <root level="DEBUG">
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="errorAppender"/>
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>