当前位置: 首页 > article >正文

项目整合logback日志打印线程id

项目打印日志能帮助我们解决很多的问题,提示我们出现的问题,通过日志我们可以准确的定位问题快速找到问题点解决问题。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
                 当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="30 seconds">
    <!--  彩色日志依赖  -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <!--  日志文件储存地址, 通过application配置文件传入  -->
    <!--    <springProperty scope="context" name="LOG_PATH" source="logback.logDir" />-->
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_PATH" value="./logs"/>

    <springProperty scope="context" name="LOG_NAME" source="spring.application.name"/>

    <!--  控制台彩色日志格式  -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--  日志文件日志格式  -->
    <property name="FILE_LOG_PATTERN"
              value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 按照每天及大小生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_PATH}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件最大大小-->
            <maxFileSize>100MB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 过滤级别,
            如果想分类生成日志文件的话(分成debug、info、error等三个日志文件, 每个文件只记录自己级别的日志),
            1. 直接把这个 <appender> 复制三分改一下 FileNamePattern 和 name.
            2. 把 <filter> 注释去掉改一下 level 就可以了
        -->
        <!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--            <level>info</level>-->
        <!--            <onMatch>ACCEPT</onMatch>-->
        <!--            <onMismatch>DENY</onMismatch>-->
        <!--        </filter>-->
    </appender>


    <!--配置异步日志-->
    <appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!--不丢失日志,默认的,如果队列的80%已满 则会丢弃TRACT,DEBUG,INFO级别的日志-->
        <discardingThreshold>0</discardingThreshold>
        <!--更改默认的队列的深度,改值会影响性能,默认值是256-->
        <queueSize>512</queueSize>
        <!--添加附加的appender,最多只能添加一个-->
        <appender-ref ref="FILE"/>
    </appender>

    <!-- 日志输出级别
        如果使用springProfile, 就需要在application配置文件中通过 spring.profiles.active=dev 来指定环境,
        也可以直接去掉 <springProfile> 这个标签或者把它整个注释掉
     -->
    <springProfile name="gzl,prod">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
        <!--项目包的路径-->
        <logger name="com.gzl.oms.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </logger>
        <logger name="com.gzl.common" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </logger>
        <!--包-->
        <!--<logger name="com.gzl.base.mapper" level="OFF"></logger>-->
        <!--类-->
        <!--<logger name="com.gzl.base.mapper.UserMapper." level="OFF"></logger>-->
        <!--方法-->
        <!--<logger name="com.gzl.base.controller.UserController.selectUserRoleAuthority" level="OFF"></logger>-->


        <!--不打印某个类下的日志-->
        <!--        <logger name="com.gzl.base.mapper.ProductInfoMapper" level="OFF"/>-->
    </springProfile>




</configuration>

打印日志的时候没有打印线程id 解决方案是添加线程id   

 [%X{trackID}]


比如
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{trackID}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!--  日志文件日志格式  -->
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} [%X{trackID}] [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />

不是一个项目的配置问题 可能会有差异。

还有一个方法是添加引用链路追踪,用的是springcloud不需要添加引用版本号

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

然后在配置文件中开启配置

spring:
  sleuth:
    enabled: true

这时候你能看到打印的线程id

有了线程id我们能完整看到一个方法调用的全链路打印日志,对处理问题很有帮助


http://www.kler.cn/a/414969.html

相关文章:

  • 【论文阅读】 Learning to Upsample by Learning to Sample
  • vue3 ajax获取json数组排序举例
  • Scrapy管道设置和数据保存
  • 【CSS】一篇掌握CSS
  • 全新AI模型家族登场:完全可复现的开源语言模型OLMo 2
  • redis大key和热key
  • GraphRAG访问模式和知识图谱建模
  • HarmonyOS-初级(一)
  • 【ANC系统】主动噪声控制系统结构分类
  • 前端——自定义组件
  • ubuntu防火墙入门(一)——设置服务、关闭端口
  • 重塑视频新语言,让每一帧都焕发新生——Video-Retalking,开启数字人沉浸式交流新纪元!
  • elasticsearch的索引模版使用方法
  • C#中面试的常见问题002
  • 将WPS的PPT 无损的用微软的PowerPoint打开
  • 基于Linux的repmgr搭建
  • golang 实现比特币内核:transaction 结构中输入和输出两部分的一些说明
  • iOS 系统中使用 webView 打印 html 的打印边距问题
  • 【C51】单片机与LED数码管的动态显示接口案例分析
  • ctfshow -web -118-124
  • node + Redis + svg-captcha 实现验证码
  • 大模型实操六、基于华为盘古大模型的基础文本处理(文本摘要、情感分析、关键词提取)
  • 使用经典的Java,还是拥抱新兴的Rust?
  • chapter05-Shell编程之免交互笔记
  • 【MySQL】MySQL中的函数之JSON_ARRAY_INSERT
  • 网络原理(一)—— http