SpringBoot配置Logback 日志不按时间和按大小分割。这个问题困扰我好几天,没时间去找原因,今天抽时间去官网简单浏览了一下,没想到找到了解决方案,或者说之前我的配置是错误的。
先把我之前的配置贴一下,我这种方案也是网上很多项目使用的,但是我去logback官网查看了简单的教程,里面并没有这种搭配。
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/${AppName}.%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
TimeBasedRollingPolicy这种策略代表按时间分割日志文件,官网都是单独使用,没和别的策略搭配,具体搭配策略需要测试一下啦。
SizeBasedTriggeringPolicy这种策略代表按尺寸分割日志文件,官网提供搭配的策略FixedWindowRollingPolicy,详细的请直接官网。
我在官方发现的解决问题方法。
Size and time based rolling policy
Sometimes you may wish to archive files essentially by date but at the same time limit the size of each log file, in particular if post-processing tools impose size limits on the log files. In order to address this requirement, logback ships with SizeAndTimeBasedRollingPolicy.
Note that TimeBasedRollingPolicy already allows limiting the combined size of archived log files. If you only wish to limit the combined size of log archives, then TimeBasedRollingPolicy described above and setting the totalSizeCap property should be amply sufficent.
Here is a sample configuration file demonstrating time and size based log file archiving.
Example: Sample configuration for SizeAndTimeBasedFNATP (logback-examples/src/main/resources/chapters/appenders/conf/logback-sizeAndTime.xml)
啥意思呢?就是说有时候啊您可能希望按日期对文件进行保存,但同时限制每个日志文件的大小,特别是如果处理工具对日志文件大小有限制的话。为了满足这个需求,使用SizeAndTimeBasedRollingPolicy来解决。如下官方提供的例子。
<configuration>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="ROLLING" />
</root>
</configuration>
Both the %i and %d tokens are mandatory. 这里需要注意日志文件中的%d、%i是不可或缺的。
下面是我的配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<property name="LOG_HOME" value="./logs" />
<property name="AppName" value="daxiangpark" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg %n</pattern>
</encoder>
</appender>
<!-- 设置分割 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 设置按尺寸和时间(同时满足)分割 -->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_HOME}/${AppName}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<!-- each file should be at most 10MB, keep 30 days worth of history,
but at most 3GB -->
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
到此,搞定了。告诫自己,知行合一,自己看到前人总结的,自己必须亲自实践过了,才能体会知。动手动手,自己知道动手能提升技能,但是你不行动,你怎么知道动手能提升技能,一点感悟分享给我和大家。
=============分割线===============
很多人留言说这个按日期按大小分割不生效,故20201008测试一波,SpringBoot2.3.0+logback .xml error级别日志,分割日志如下图所示: