总结:生产环境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 ..."}