在上一篇《Spring Boot 初级入门教程(二) —— 日志备份》中,只是简单说明了下日志的备份方法,并没有做更多的配置说明,这篇主要说一下如何分类备份不同的日志。
一、修改日志配置文件的文件名。
上篇中,创建的日志文件名为 logback.xml,开始配置前,想把文件名修改一下,修成成 logback-spring.xml,效果和原来一样,并不影响日志的保存。
那为什么要修改文件名了?官网上有这么一段说明:
When possible, we recommend that you use the -spring variants for your logging configuration (for example, logback-spring.xml rather than logback.xml). If you use standard configuration locations, Spring cannot completely control log initialization.
大概意思是:如果可能,我们建议您使用 -spring 变体进行日志记录配置(例如,logback-spring.xml 而不是 logback.xml)。 如果使用标准配置位置,Spring无法完全控制日志初始化。
Because the standard logback.xml configuration file is loaded too early, you cannot use extensions in it. You need to either use logback-spring.xml or define a logging.config property.
大概意思是:由于标准 logback.xml 配置文件加载过早,因此无法在其中使用扩展。您需要使用 logback-spring.xml 或定义 logging.config 属性。
综上,既然官网建议用带 -spring 扩展的文件名,那就直接改了再说。运行项目,测试一下,日志还是可以保存,并不影响。
二、一次修改配置文件
首先查看控制台输出和配置文件输出,发现配置文件保存的内容,并没有控制台输出多,那么首先让控制台的输出和日志保存一致。
修改后的配置文件部分为:
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="baselog" />
</root>
<!-- <logger name="com.menglanglang.test.springboot" level="DEBUG">
<appender-ref ref="baselog" />
</logger> -->
再次运行,查看 base.log 内容,可以发现日志内容和控制台输出几乎一致了。当然,banner 信息和 banner 之前的信息,以及system.out 输出的内容,是不会进入日志的。
三、二次修改配置文件
目前日志输出是一份,可以发现里面有有 INFO、DEBUG、ERROR 等全部信息,新的需求是,想把日志拆分,如所有 ERROR 信息放到一个新文件,而没有其它 DEBUG 或者 INFO 信息,该如何配置。
修改后的配置文件为:
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名 -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>%d %p (%file:%line\)- %m%n</pattern>
- <charset>UTF-8</charset>
- </encoder>
- </appender>
- <!-- 日志文件输出设置 -->
- <appender name="baselog" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <File>log/base.log</File>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>log/base.log.%d.%i</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>10 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- </rollingPolicy>
- <encoder>
- <pattern>%d %p (%file:%line\)- %m%n</pattern>
- <charset>UTF-8</charset>
- </encoder>
- </appender>
- <!-- TRACE 级别日志文件输出设置 -->
- <appender name="fileTraceLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <File>log/trace.log</File>
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''} - %m%n</pattern>
- <charset>UTF-8</charset>
- </encoder>
- <!--滚动策略 -->
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--路径 -->
- <fileNamePattern>log/trace.log.%d.%i</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>1 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <maxHistory>3</maxHistory>
- </rollingPolicy>
- </appender>
- <!-- DEBUG 级别日志文件输出设置 -->
- <appender name="fileDebugLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <File>log/debug.log</File>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>DEBUG</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''} - %m%n</pattern>
- <charset>UTF-8</charset>
- </encoder>
- <!--滚动策略 -->
- <rollingPolicy
- class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--路径 -->
- <fileNamePattern>log/debug.log.%d.%i</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>1 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <maxHistory>3</maxHistory>
- </rollingPolicy>
- </appender>
- <!-- INFO 级别日志文件输出设置 -->
- <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <File>log/info.log</File>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>INFO</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''} - %m%n</pattern>
- <charset>UTF-8</charset>
- </encoder>
- <!--滚动策略 -->
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--路径 -->
- <fileNamePattern>log/info.log.%d.%i</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>1 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <maxHistory>3</maxHistory>
- </rollingPolicy>
- </appender>
- <!-- WARN 级别日志文件输出设置 -->
- <appender name="fileWarnLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <File>log/warn.log</File>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>WARN</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''} - %m%n</pattern>
- <charset>UTF-8</charset>
- </encoder>
- <!--滚动策略 -->
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--路径 -->
- <fileNamePattern>log/warn.log.%d.%i</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>1 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <maxHistory>3</maxHistory>
- </rollingPolicy>
- </appender>
- <!-- ERROR 级别日志文件输出设置 -->
- <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <File>log/error.log</File>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERROR</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''} - %m%n</pattern>
- <charset>UTF-8</charset>
- </encoder>
- <!--滚动策略 -->
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--路径 -->
- <fileNamePattern>log/error.log.%d.%i</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>1 MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <maxHistory>3</maxHistory>
- </rollingPolicy>
- </appender>
- <root level="TRACE">
- <appender-ref ref="fileTraceLog" />
- <appender-ref ref="fileDebugLog" />
- <appender-ref ref="fileInfoLog" />
- <appender-ref ref="fileWarnLog" />
- <appender-ref ref="fileErrorLog" />
- <appender-ref ref="baselog" />
- <appender-ref ref="STDOUT" />
- </root>
- <!-- 自定义指定类的日志输出 -->
- <!-- <logger name="com.menglanglang.test.springboot" level="DEBUG"> <appender-ref
- ref="baselog" /> </logger> -->
- </configuration>
运行程序后,可以看到 log 目录下已经按照不同的级别输出日志了。
除了在 root 标签上设置 level 级别外,还可以在项目配置文件 application.properties 中,设置下面两个配置的任何一个,都可以设置日志级别。
# 日志显示级别
trace=true
# 设置日志级别
logging.level.root=TRACE
建议,在开发过程中,日志一般设置成 INFO 级别就足够了,如果设置成 TRACE 或者 DEBUG,日志文件将非常庞大,控制台输出太多 log 还将导致 IDE 卡死。