这篇文章主要提供一个 xml格式的 Logback 配置文件参考,详细技术细节参考
Java 日志实现框架 Logback
说明
以下所有的配置只依赖 Logback 官方的 jar 包,不使用任何第三方的扩展包,可以移植到任意环境中
配置文件加载顺序
Logback 会按照以下顺序查找配置文件
- 首先在 classpath 中查找 logback-test.xml,如果找不到
- Logback 会在 classpath 中查找 logback.groovy,如果找不到
- Logback 会在 classpath 中查找 logback.xml,如果找不到
- Logback 将进行自动配置
xml 配置样例
无颜色的配置样例
logback-test.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan :开启"热更新" scanPeriod:"热更新"扫描周期,默认 60 seconds(60秒)-->
<configuration scan="true" scanPeriod="300 seconds">
<!-- 自定义变量,用于配置日志输出格式,这个格式是尽量偏向 spring boot 默认的输出风格
%date:日期,默认格式 yyyy-MM-dd hhh:mm:ss,SSS 默认使用本机时区,通过 %d{yyyy-MM-dd hhh:mm:ss,SSS} 来自定义
%-5level:5个占位符的日志级别,例如" info"、"error"
%thread : 输出日志的线程
%class : 输出日志的类的完全限定名,效率低
%method : 输出日志的方法名
%line : 输出日志的行号,效率低
%msg : 日志消息内容
%n : 换行
-->
<property name="LOG_PATTERN" value="%date %-5level --- [%thread] %class.%method/%line : %msg%n"/>
<!--日志输出器. ch.qos.logback.core.ConsoleAppender : 输出到控制台-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 配置日志输出格式 -->
<pattern>${LOG_PATTERN}</pattern>
<!-- 使用的字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日志输出器。ch.qos.logback.core.rolling.RollingFileAppender : 滚动输出到文件 -->
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 活动中的日志文件名(支持绝对和相对路径) -->
<file>logs/app1/app1.log</file>
<!-- 滚动策略. ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy : 按照大小和时间滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 何时触发滚动,如何滚动,以及滚动文件的命名格式
%d : 日期,默认格式 yyyy-MM-dd,通过 %d{yyyy-MM-dd hhh:mm:ss} 来自定义格式。logback 就是通过 %d 知道了触发滚动的时机
%i : 单个滚动周期内的日志文件的序列号
.zip : 将日志文件压缩成zip。不想压缩,可以使用.log 结尾
如下每天0点以后的第一日志请求触发滚动,将前一天的日志打成 zip 压缩包存放在 logs/app1/backup 下,并命名为 app1_%d_%i.zip
-->
<fileNamePattern>logs/app1/backup/app1_%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
<!--单个日志文件的最大大小-->
<maxFileSize>10MB</maxFileSize>
<!--删除n个滚动周期之前的日志文件(最多保留前n个滚动周期的历史记录)-->
<maxHistory>30</maxHistory>
<!-- 在有 maxHistory 的限制下,进一步限制所有日志文件大小之和的上限,超过则从最旧的日志开始删除-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- 日志输出格式 -->
<pattern>${LOG_PATTERN}</pattern>
<!-- 使用的字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 记录器 name : 包名或类名, level : 要记录的日志的起始级别, additivity : 是否追加父类的 appender -->
<logger name="com.wqlm.boot" level="debug" additivity="false" >
<appender-ref ref="STDOUT" />
</logger>
<!-- 根记录器 -->
<root level="info">
<!-- 使用 STDOUT、ROLLING 输出记录的日志-->
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING"/>
</root>
</configuration>
带颜色的配置样例
上面的配置文件,功能上没有任何问题,只是控制台输出的的黑白的,不便于观察,Logback 本身是支持彩色显示的,支持的颜色如下
- %black()
- %red()
- %green()
- %yellow()
- %blue()
- %magenta()
- %cyan()
- %white()
- %gray()
- %boldRed()
- %boldGreen()
- %boldYellow()
- %boldBlue()
- %boldMagenta()
- %boldCyan()
- %boldWhite()
- %highlight()
使用方法就是将你要显示的颜色的内容用上面的代码包起来,以下是一份彩色的配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan :开启"热更新" scanPeriod:"热更新"扫描周期,默认 60 seconds(60秒)-->
<configuration scan="true" scanPeriod="300 seconds">
<!-- 自定义变量,用于配置日志输出格式,这个格式是尽量偏向 spring boot 默认的输出风格
%date:日期,默认格式 yyyy-MM-dd hhh:mm:ss,SSS 默认使用本机时区,通过 %d{yyyy-MM-dd hhh:mm:ss,SSS} 来自定义
%-5level:5个占位符的日志级别,例如" info"、"error"
%thread : 输出日志的线程
%class : 输出日志的类的完全限定名,效率低
%method : 输出日志的方法名
%line : 输出日志的行号,效率低
%msg : 日志消息内容
%n : 换行
-->
<property name="LOG_PATTERN" value="%date %-5level --- [%thread] %class.%method/%line : %msg%n"/>
<!-- 彩色日志格式 -->
<property name="LOG_PATTERN_COLOURS" value="%date %green(%-5level) --- [%thread] %cyan(%class.%method/%line) : %msg%n"/>
<!--日志输出器. ch.qos.logback.core.ConsoleAppender : 输出到控制台-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 配置日志输出格式 -->
<pattern>${LOG_PATTERN_COLOURS}</pattern>
<!-- 使用的字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日志输出器。ch.qos.logback.core.rolling.RollingFileAppender : 滚动输出到文件 -->
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 活动中的日志文件名(支持绝对和相对路径) -->
<file>logs/app1/app1.log</file>
<!-- 滚动策略. ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy : 按照大小和时间滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 何时触发滚动,如何滚动,以及滚动文件的命名格式
%d : 日期,默认格式 yyyy-MM-dd,通过 %d{yyyy-MM-dd hhh:mm:ss} 来自定义格式。logback 就是通过 %d 知道了触发滚动的时机
%i : 单个滚动周期内的日志文件的序列号
.zip : 将日志文件压缩成zip。不想压缩,可以使用.log 结尾
如下每天0点以后的第一日志请求触发滚动,将前一天的日志打成 zip 压缩包存放在 logs/app1/backup 下,并命名为 app1_%d_%i.zip
-->
<fileNamePattern>logs/app1/backup/app1_%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
<!--单个日志文件的最大大小-->
<maxFileSize>10MB</maxFileSize>
<!--删除n个滚动周期之前的日志文件(最多保留前n个滚动周期的历史记录)-->
<maxHistory>30</maxHistory>
<!-- 在有 maxHistory 的限制下,进一步限制所有日志文件大小之和的上限,超过则从最旧的日志开始删除-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- 日志输出格式 -->
<pattern>${LOG_PATTERN}</pattern>
<!-- 使用的字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 记录器 name : 包名或类名, level : 要记录的日志的起始级别, additivity : 是否追加父类的 appender -->
<logger name="com.wqlm.boot" level="debug" additivity="false" >
<appender-ref ref="STDOUT" />
</logger>
<!-- 根记录器 -->
<root level="info">
<!-- 使用 STDOUT、ROLLING 输出记录的日志-->
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING"/>
</root>
</configuration>
上面,我只在控制台的输出中加了颜色,输出到文件中没有加(如果你愿意,也可以加)效果如下
根据日志级别切换颜色的配置样例
美中不足的一点是所有的日志级别都是同一种颜色,要是不同的日志级别对应不同的颜色就好了。
其实也可以做到,只是配置稍微麻烦点,具体如下
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan :开启"热更新" scanPeriod:"热更新"扫描周期,默认 60 seconds(60秒)-->
<configuration scan="true" scanPeriod="300 seconds">
<!-- 自定义变量,用于配置日志输出格式,这个格式是尽量偏向 spring boot 默认的输出风格
%date:日期,默认格式 yyyy-MM-dd hhh:mm:ss,SSS 默认使用本机时区,通过 %d{yyyy-MM-dd hhh:mm:ss,SSS} 来自定义
%-5level:5个占位符的日志级别,例如" info"、"error"
%thread : 输出日志的线程
%class : 输出日志的类的完全限定名,效率低
%method : 输出日志的方法名
%line : 输出日志的行号,效率低
%msg : 日志消息内容
%n : 换行
-->
<property name="LOG_PATTERN" value="%date %-5level --- [%thread] %class.%method/%line : %msg%n"/>
<!-- 彩色日志格式 -->
<property name="LOG_PATTERN_GREEN"
value="%date %green(%-5level) --- [%thread] %cyan(%class.%method/%line) : %msg%n"/>
<property name="LOG_PATTERN_YELLOW"
value="%date %yellow(%-5level) --- [%thread] %cyan(%class.%method/%line) : %msg%n"/>
<property name="LOG_PATTERN_RED" value="%date %red(%-5level) --- [%thread] %cyan(%class.%method/%line) : %msg%n"/>
<!--日志输出器. ch.qos.logback.core.ConsoleAppender : 输出到控制台-->
<appender name="STDOUT_DEBUG" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过滤器 只输出 debug 级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 只输出 debug 级别的日志 -->
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<!-- 配置日志输出格式 -->
<pattern>${LOG_PATTERN_GREEN}</pattern>
<!-- 使用的字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="STDOUT_INFO" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${LOG_PATTERN_GREEN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="STDOUT_WARN" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${LOG_PATTERN_YELLOW}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="STDOUT_ERROR" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${LOG_PATTERN_RED}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日志输出器。ch.qos.logback.core.rolling.RollingFileAppender : 滚动输出到文件 -->
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 活动中的日志文件名(支持绝对和相对路径) -->
<file>logs/app1/app1.log</file>
<!-- 滚动策略. ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy : 按照大小和时间滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 何时触发滚动,如何滚动,以及滚动文件的命名格式
%d : 日期,默认格式 yyyy-MM-dd,通过 %d{yyyy-MM-dd hhh:mm:ss} 来自定义格式。logback 就是通过 %d 知道了触发滚动的时机
%i : 单个滚动周期内的日志文件的序列号
.zip : 将日志文件压缩成zip。不想压缩,可以使用.log 结尾
如下每天0点以后的第一日志请求触发滚动,将前一天的日志打成 zip 压缩包存放在 logs/app1/backup 下,并命名为 app1_%d_%i.zip
-->
<fileNamePattern>logs/app1/backup/app1_%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
<!--单个日志文件的最大大小-->
<maxFileSize>10MB</maxFileSize>
<!--删除n个滚动周期之前的日志文件(最多保留前n个滚动周期的历史记录)-->
<maxHistory>30</maxHistory>
<!-- 在有 maxHistory 的限制下,进一步限制所有日志文件大小之和的上限,超过则从最旧的日志开始删除-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- 日志输出格式 -->
<pattern>${LOG_PATTERN}</pattern>
<!-- 使用的字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 记录器 name : 包名或类名, level : 要记录的日志的起始级别, additivity : 是否追加父类的 appender -->
<logger name="com.wqlm.boot" level="debug" additivity="false">
<appender-ref ref="STDOUT_DEBUG"/>
<appender-ref ref="STDOUT_INFO"/>
<appender-ref ref="STDOUT_WARN"/>
<appender-ref ref="STDOUT_ERROR"/>
</logger>
<!-- 根记录器 -->
<root level="info">
<!-- 使用 STDOUT、ROLLING 输出记录的日志-->
<appender-ref ref="STDOUT_INFO"/>
<appender-ref ref="STDOUT_WARN"/>
<appender-ref ref="STDOUT_ERROR"/>
<appender-ref ref="ROLLING"/>
</root>
</configuration>
结果如下