logback日志无法按日期分割的问题
发现在线上的时候,日志无法按日期分割的问题,所有日志都在第一天部署的那个日期的文件里面。
背景是Springboot + logback
原因是:
之前是:
用timeBaseRollingPolicy来设定日志保留日期和格式:
用sizeBaseTriggerPolicy来设定最大日志文件
但是!!!
基于时间的滚动切割策略 TimeBasedRollingPolicy
,每天0点自动生成一份新的日志文件,但里面包含了一段 triggeringPolicy
触发策略,即最大单个文件超过 10MB 自动新成新日志文件, TimeBasedRollingPolicy
是基于时间的,不能和其他策略一起组合使用。
也就是说这两个policy是冲突的。
解决方法:
改用使用时间和大小组合策略 SizeAndTimeBasedRollingPolicy:
顺便上最后完整的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="LOG_HOME" value="log" /> <!-- linux上用绝对路径试试 --> <!-- <property name="LOG_HOME" value="/home/inforPoint/log" /> --> <!-- 控制台输出 --> <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> --> <pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %black(${PID}) --- %green([%thread]) %boldMagenta(%logger{50}) : %cyan(%msg%n)</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <!--过滤掉error的级别--> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <!-- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 日志文件输出的文件名 <FileNamePattern>${LOG_HOME}/inforPoint_log_%d{yyyy-MM-dd}.log</FileNamePattern> 日志文件保留天数 <MaxHistory>5</MaxHistory> </rollingPolicy> --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 之前的 rollingPolicy和triggeringPolicy冲突了 用一个新的标签 结合两者 --> <!-- 日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/inforPoint_log_%d{yyyy-MM-dd}_%i.log</FileNamePattern> <!-- 日志文件保留天数 --> <MaxHistory>5</MaxHistory> <!-- 日志文件最大尺寸 --> <maxFileSize>10MB</maxFileSize> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID} --- [%thread] %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> --> </appender> <!-- 按照每天生成error日志文件 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level><!--//打印error--> </filter> <!-- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 日志文件输出的文件名 <FileNamePattern>${LOG_HOME}/inforPoint_error_log_%d{yyyy-MM-dd}.log</FileNamePattern> 日志文件保留天数 <MaxHistory>5</MaxHistory> </rollingPolicy> --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 之前的 rollingPolicy和triggeringPolicy冲突了 用一个新的标签 结合两者 --> <!-- 日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/inforPoint_error_log_%d{yyyy-MM-dd}_%i.log</FileNamePattern> <!-- 日志文件保留天数 --> <MaxHistory>5</MaxHistory> <!-- 日志文件最大尺寸 --> <maxFileSize>10MB</maxFileSize> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID} --- [%thread] %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <!-- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> --> </appender> <!--myibatis log configure--> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <!-- 可能是比较新的版本,会有很多thymeleaf configuration的日志,所以设个等级来避免 --> <logger name="org.thymeleaf.TemplateEngine.CONFIG" level="WARN" /> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> <appender-ref ref="ERROR_FILE" /> </root> <!--日志异步到数据库 --> <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">--> <!--<!–日志异步到数据库 –>--> <!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">--> <!--<!–连接池 –>--> <!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">--> <!--<driverClass>com.mysql.jdbc.Driver</driverClass>--> <!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>--> <!--<user>root</user>--> <!--<password>root</password>--> <!--</dataSource>--> <!--</connectionSource>--> <!--</appender>--> </configuration>
参考博客:
http://www.ibloger.net/article/3199.html——《坑爹的Logback日志无法按天切割问题》