首页 > 其他分享 >@Slf4j实现多线程场景下每个线程日志独立输出

@Slf4j实现多线程场景下每个线程日志独立输出

时间:2024-11-21 15:43:52浏览次数:3  
标签:%- Dubbo 5level MDC threadName replace Slf4j 线程 多线程

1.配置logbak-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds">

    <!-- 定义日志文件的存储路径 -->
    <property name="LOGS_PATH" value="./logs/" />
    <timestamp key="datetime" datePattern="yyyy-MM-dd"/>
    <springProperty scope="context" name="APP_NAME" source="com.appName" defaultValue="LOG"/>

    <!--0. 日志格式和颜色渲染 -->
    <!-- 彩色日志依赖的渲染类 -->
    <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" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{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}}"/>

    <!-- 控制台日志输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date %-5level [%replace(%thread){'DubboServerHandler-','Dubbo'}] %logger{35}[%L] - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 使用 MDC 的 appender 核心!!!-->
    <appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>threadName</key>
            <defaultValue>main</defaultValue>
        </discriminator>
        <sift>
            <appender name="FILE-${threadName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <encoder>
                    <Encoding>UTF-8</Encoding>
                    <pattern>%date %-5level [%replace(%thread){'DubboServerHandler-','Dubbo'}] %logger{35}[%L] - %msg%n</pattern>
                </encoder>
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <!--日志文件名称格式-->
                    <fileNamePattern>${LOGS_PATH}%d{yyyyMMdd}/${threadName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <!-- 日志文件保留30天 -->
                    <maxHistory>30</maxHistory>
                    <!--单文件大小-->
                    <maxFileSize>100MB</maxFileSize>
                    <totalSizeCap>10GB</totalSizeCap>
                </rollingPolicy>
            </appender>
        </sift>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

2.在方法中使用MDC

MDC.put("threadName", "yourName");
//具体业务代码
MDC.remove("threadName")

注意:threadName和xml文件中的<discriminator>标签中的<key>一致;

3.运行代码,即可得到同一项目的日志分离如以下结果:

标签:%-,Dubbo,5level,MDC,threadName,replace,Slf4j,线程,多线程
From: https://blog.csdn.net/qq_44708723/article/details/143947602

相关文章

  • Java中常用的线程安全单例模式实现
    在Java中,实现线程安全的单例模式有多种方式。以下是几种常用的线程安全单例模式实现:1.饿汉式(线程安全,类加载时初始化)特点:简单且线程安全,但如果实例过于占用资源且程序可能不使用它,会造成内存浪费。publicclassSingleton{privatestaticfinalSingletonINSTANCE......
  • 详解线程的三大特性:原子性、可见性和有序性
    在多线程编程中,理解线程的原子性、可见性和有序性是构建正确并发程序的基础。以下是它们的详细解释:1.原子性(Atomicity)定义原子性指的是操作不可被中断,要么全部执行完成,要么完全不执行。特性原子性操作在执行时不会被其他线程干扰。如果多个线程同时访问共享资......
  • Java线程池创建
    ......
  • Qt - 多线程之并发(QtConcurrent)
    一、什么是QtConcurrent?Concurrent是并发的意思,而QtConcurrent同std一样,是一个命名空间(namespace)。提供了一些高级的API,使得在编写多线程的时候,无需使用低级线程原语,如读写锁,等待条件或信号。使用QtConcurrent编写的程序会根据可用的处理器内核数自动调整使用的线程数。对于QtC......
  • Qt - 多线程之线程同步
    一、线程为什么要同步使用两个线程对一个全局变量做累加,从0加到10,所以只要每个线程累加到5就行。代码如下所示:#include<QApplication>#include<QThread>#include<QDebug>//定义共享资源intsharedValue=0;//定义一个线程类classMyThread:publicQThread{pub......
  • Qt - 多线程之线程的开始、暂停、恢复、停止
    示例1在Qt中,可以使用QThread的线程控制功能来暂停和恢复一个线程。这里是一个简单的例子: #include<QThread>#include<QDebug>classWorkerThread:publicQThread{voidrun()override{qDebug()<<"Threadisrunning";//执行一些任务......
  • 模拟线程池与异步方法调用查询接口优化
    问题:批量查询如何优化?entity实体类packagecom.itheima.alipay.prop;importlombok.Data;@DatapublicclassUserInfo{privateLonguserId;privateStringusername;privateintage;publicUserInfo(LonguserId,Stringusername,intage){......
  • Java面试之多线程&并发篇(6)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!产生死锁的四个必要条件?如何避免死锁?线程池核心线程数怎么设置呢?Java线程池中队列常用类型有哪些?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理******java核心面试知识整理***......
  • C#单线程环境下实现每秒百万级调度
    C#并发控制框架:单线程环境下实现每秒百万级调度 阅读目录前言并发流程控制框架框架优势框架示例框架地址总结最后前言在工业自动化和机器视觉领域,对实时性、可靠性和效率的要求越来越高。为了满足这些需求,我们开发了一款专为工业自动化运动控制和机器视觉流程开发......
  • Linux线程退出、资源回收、资源清理的方法
    参考 Linux线程退出、资源回收、资源清理的方法_linux线程退出会释放哪些资源-CSDN博客 首先说明线程中要回收哪些资源,理解清楚了这点之后在思考资源回收的问题。1、子线程创建时从父线程copy出来的栈内存;线程退出有多种方式,如return,pthread_exit,pthread_cancel等;线......