总结:生产环境Logback日志配置模板与pattern格式案例

总结:生产环境Logback日志配置模板与pattern格式案例

一·生产级 logback-spring.xml 配置文件完整示例:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- 
configuration配置说明:
    1.scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
    2.scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟
    3.debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false
-->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!--
property:
    1.节点用来定义变量值,可以通过 ${} 来使用变量
    2.彩色日志配置:
         彩色日志格式变量:CONSOLE_LOG_PATTERN  
         magenta:洋红 
         boldMagenta:粗红
         cyan:青色 
         white:白色 
         magenta:洋红
         %d:表示日期
         %thread:表示线程名
         %-5level:"-"左对齐,"5" 不满 5 位右补空格
         %logger{40}:Java 类名(含包名,这里设定了 40 位,若超过 40 位,包名会精简为类似 a.b.c.JavaBean 形式)
         %msg:日志消息
         %n:换行符
-->
    <property name="log.path" value="/Users/ideal/Downloads/"/>
    <property name="CONSOLE_LOG_PATTERN" 
              value="%yellow(%date{yyyy-MM-dd HH:mm:ss.SSS}) | %highlight(%-5level) | %green(%thread) | %cyan(%logger{50}-%M:%line) : %msg%n"/>
    <property name="FILE_LOG_PATTERN" 
              value="%date{yyyy-MM-dd HH:mm:ss.SSS} | %-5level | %thread | %logger{50}-%M:%line : %msg%n"/>
    
<!--    
contextName:
    1.设置上下文名称,每一个日志组件(logger)都会关联到日志上下文,默认上下文名称是'default',用于标识应用,如果多个应用输出到同一个地方,就有必要使用%contextName来区别
-->
    <contextName>logback</contextName>
    
<!--
输出到控制台配置:
    1.此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息
      例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出
-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
        <!-- 输出 DEBUG 级别及以上的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>
    
<!--
RollingFileAppender滚动输出到文件配置:
    一·filter过滤器配置:
        1.ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
        2.LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有以下子节点:
              (1)<level>:设置过滤级别
              (2)<onMatch>:用于配置符合过滤条件的操作
              (3)<onMismatch>:用于配置不符合过滤条件的操作
                            DENY:如果方法返回DENY(拒绝),则跳出过滤链,而该 logging event 也会被抛弃。
                            NRUTRAL:如果返回NRUTRAL(中立),则继续过滤链中的下一个过滤器。
                            ACCEPT:如果返回ACCEPT(通过),则跳出过滤链
-->
    <!--记录 info 级别以上的日志到文件保存-->
    <appender name="INFO_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志文件的路径及文件名(正在记录的日志文件路径) -->
        <file>${log.path}/log_info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <!--字符集-->
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式(归档日志文件的路径) -->
            <fileNamePattern>${log.path}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 单个日志文件最大的大小 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
            <!-- 文件总大小(可以忽略) -->
        <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--此日志文件只记录 info 级别以上的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>
    

    
    <!--记录 warn 级别以上的日志到文件保存-->
    <appender name="WARN_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志文件的路径及文件名(正在记录的日志文件路径) -->
        <file>${log.path}/log_warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <!--字符集-->
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式(归档日志文件的路径) -->
            <fileNamePattern>${log.path}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 单个日志文件最大的大小 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
            <!-- 文件总大小(可以忽略) -->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!-- 此日志文件只记录 warn 以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>


    <!--记录 error 级别以上的日志到文件保存-->
    <appender name="ERROR_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志文件的路径及文件名(正在记录的日志文件路径) -->
        <file>${log.path}/log_error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <!--字符集-->
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式(归档日志文件的路径) -->
            <fileNamePattern>${log.path}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 单个日志文件最大的大小 -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
            <!-- 文件总大小(可以忽略) -->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!-- 此日志文件只记录 error 级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

<!--
springProfile:spring框架下可用,多个之间用逗号隔开,表示多个环境
    1.dev、uat开发环境:打印控制台
    2.prod生产环境:输出到文件
    
root节点:是必选节点且一个环境只能只有一个root,用来指定最基础的日志输出级别,只有一个level属性
    1.level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR,ALL 和 OFF,默认是DEBUG
    2.可以包含零个或多个appender元素。
    
logger节点:用来指定某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。跟root节点属于同一个级别。一个环境下可以存在任意个logger。
    1.name:要输出日志的包名或者类名,比如com.example.lmf.mapper。必选项。
    2.level:设置日志级别,允许一个不区分大小写的字符串值TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF。如果未设置,则logger会向上继承最近一个非空级别。可选项。
    3.additivity:是否将日志向上级传递,默认为 true。可选项

root和logger的关系:
    1.root和logger是父子的关系。
    2.logger对单个包或类添加配置,相当于局部配置,root相当于全局配置
    3.Logger的appender根据参数additivity,决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。
    4.如果logger里面配置了additivity="false",同样的日志就会覆盖root的,只打印一遍;但是additivity="true",就会向上层再次传递,不会覆盖,而是打印两遍!
-->
    <springProfile name="local,dev,uat">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
        </root>
        <!--mapper层级的sql日志级别为debug-->
        <logger name="com.example.lmf.mapper" level="DEBUG" additivity="true" />
    </springProfile>
    
    
    <!--生产环境:输出到文件-->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="INFO_LOG_FILE"/>
            <appender-ref ref="WARN_LOG_FILE"/>
            <appender-ref ref="ERROR_LOG_FILE"/>
        </root>
        <!--mapper层级的sql日志级别为debug-->
        <logger name="com.example.lmf.mapper" level="DEBUG" additivity="true" />
    </springProfile>


    <!--不指定环境配置,直接使用-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="INFO_LOG_FILE"/>
        <appender-ref ref="WARN_LOG_FILE"/>
        <appender-ref ref="ERROR_LOG_FILE"/>
        <!--mapper层级的sql日志级别为debug-->
        <logger name="com.example.lmf.mapper" level="DEBUG" additivity="true" />
    </root>
</configuration>

二·日志各种输出格式Pattern案例:

1·标准生产版(含方法名+行号)(强烈推荐)

xml 复制代码
(1)不加颜色输出:适合滚动文件日志打印器,加颜色会出现一堆文本转义符
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} | %-5level | %thread | %logger{50}-%M:%line : %msg%n</pattern>

(2)加颜色输出:适合控制台打印
<pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss.SSS}) | %highlight(%-5level) | %green(%thread) | %cyan(%logger{50}-%M:%line) : %msg%n</pattern>


示例输出

2026-05-07 15:29:13.208 | INFO  | localhost-startStop-1 | c.j.c.listener.InitiateEndApplicationListener-onApplicationEvent:19 : -----------app初始化启动中---------------------------

2·链路追踪版(traceId/spanId + 方法名+行号)

xml 复制代码
(1)不加颜色输出格式:需要颜色参考第一个案例
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [traceId=%X{traceId} spanId=%X{spanId}] %logger{36}.%M:%line : %msg%n</pattern>

示例输出:
2026-05-07 16:11:02.907 WARN  [http-nio-8080-exec-5] [traceId=9f3a1b2c spanId=7d8e9f10] c.jd.cparent.contract.bis.service.docusign.DocusignService.queryEnvelope:215 : DocuSign接口超时,准备第2次重试

3·API版(requestId + URI + 方法名+行号)

xml 复制代码
(1)不加颜色输出格式:需要颜色参考第一个案例
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [reqId=%X{requestId} uri=%X{requestUri}] %logger{30}.%M:%line : %msg%n</pattern>

示例输出:
2026-05-07 16:13:18.554 INFO  [http-nio-8080-exec-8] [reqId=REQ-20260507-001 uri=/api/contract/sign] c.jd.cparent.contract.web.SignController.submit:89 : 请求处理完成,耗时=37ms

4·JSON单行版(含method/line)

xml 复制代码
(1)不加颜色输出格式:需要颜色参考第一个案例
<pattern>{"ts":"%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}","level":"%level","thread":"%thread","logger":"%logger{36}","method":"%M","line":"%line","traceId":"%X{traceId}","msg":"%replace(%msg){'\"','\\\"'}","ex":"%replace(%ex){'\n','\\n'}"}%n</pattern>


示例输出:
{"ts":"2026-05-07T16:14:29.102+08:00","level":"ERROR","thread":"task-2","logger":"c.jd.cparent.contract.bis.service.docusign.DocusignService","method":"downloadSignedFile","line":"331","traceId":"c2a4f8d1","msg":"下载签署文件失败,envelopeId=abc123","ex":"java.lang.RuntimeException: remote 500\n\tat ..."}
相关推荐
ooseabiscuit1 小时前
Laravel3.x核心特性全解析
java·数据库·spring
凤山老林1 小时前
慢SQL治理:索引优化实战指南——从定位到优化的完整解决方案
java·sql·springboot·慢sql治理·sql 性能优化
Aision_5 小时前
从工具调用到 MCP、Skill完整学习记录
java·python·gpt·学习·langchain·prompt·agi
zc.z9 小时前
JAVA实现:纯PCM格式音频转换成BASE64
java·音视频·pcm
mask哥9 小时前
力扣算法java实现汇总整理(上)
java·算法·leetcode
Aaswk11 小时前
Java Lambda 表达式与流处理
java·开发语言·python
是宇写的啊11 小时前
Spring AOP
java·spring
万邦科技Lafite11 小时前
京东item_get接口实战案例:实时商品价格监控全流程解析
java·开发语言·数据库·python·开放api·淘宝开放平台
Mr_pyx12 小时前
Spring AI 入门教程:Java开发者的AI应用捷径
java·人工智能·spring