先说结论:
原因一:
使用的rollingPolicy ch.qos.logback.core.rolling.TimeBasedRollingPolicy不对,
解决办法 :替换rollingPolicy ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy 后即可
原因二:
<FileNamePattern>中使用了多个'%d'修饰的变量参数而没加任何辅助修饰,例如:
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM}/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern>(错误示范)
解决办法:辅助变量的位置加入aux修饰
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM, aux}/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
--------------------------正文开始--------------------------
项目运行几天,发现日志并没有按配置好的那样每天自动按格式生成日志文件, 于是网上找了找解决方案. 底下评论基本都是说能解决,基本上都是只说了
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
替换为:
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
这一种思路, 有部分人确实可以解决这个问题,
但放到我这个项目下就不行了, 于是我对比了一下区别
<appender name="LOG_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 ---->>>下边这行有区别<<<---
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM}/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>90</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} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!--过滤器,只打ERROR级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--日志文件最大的大小-->
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
<!--<MaxFileSize>10MB</MaxFileSize>-->
<!--</triggeringPolicy>-->
</appender>
问题就在这下边这行配置中:
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM}/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern>(错误示范)
我自作主张的多了一层按月切分的文件层级, 但实际效果就是后边的按日期设置并没有生效,
我去查了官方文档,发现了问题所在,截图如下

当指定多个: %d参数时 必须声明次要的%d参数 也就是用 'aux' 来指定辅助参数,
最重改成了下边这个样子, 重启项目 测试日志 是生效的!
<FileNamePattern>${LOG_HOME}/%d{yyyy-MM,aux}/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
贴一下我这个项目的log配置吧 ,给有需要的人, 虽然有点乱 (滑稽)
简单说一下这个配置的基本效果:
按月 存放日志文件, 按日期.单日日志数量 来切分日志, 日志分为三个级别的:info warn error,每种级别分开输出,单独路径文件存放
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径,请务必使用绝对路径--> <!--<property name="LOG_HOME" value="F://log//GAM-log" />--> <!--开发环境--> <springProfile name="dev"> <property name="LOG_HOME" value="dev-log"/> </springProfile> <!--测试环境--> <springProfile name="test"> <!--<property name="LOG_HOME" value="E://omp-log"/>--> <property name="LOG_HOME" value="E://test-log"/> </springProfile> <!--生产环境--> <springProfile name="prod"> <property name="LOG_HOME" value="/var/www/html/logs"/> </springProfile> <!-- 控制台输出 --> <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>%-5level %logger{50} - %msg%n</pattern>--> </encoder> </appender> <!-- INFO按照每天生成日志文件 --> <appender name="LOG_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM, aux}/info/info-%d{yyyy-MM-dd}.%i.log</FileNamePattern> <!--<FileNamePattern>${LOG_HOME}/info/info-%d{yyyy-MM-dd}.%i.log</FileNamePattern>--> <!--%d{yyyy-MM,aux}/info-%d{yyyy-MM-dd}-%i.log--> <!--日志文件保留天数--> <MaxHistory>90</MaxHistory> <!--日志文件最大的大小--> <MaxFileSize>10MB</MaxFileSize> </rollingPolicy> <!--过滤器,只打INFO级别的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <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> <charset>UTF-8</charset> <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern>--> </encoder> <!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">--> <!--日志文件最大的大小--> <!--<MaxFileSize>10MB</MaxFileSize>--> <!--</triggeringPolicy>--> </appender> <!-- WARN按照每天生成日志文件 --> <appender name="LOG_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM, aux}/warn/warn-%d{yyyy-MM-dd}.%i.log</FileNamePattern> <!--<FileNamePattern>${LOG_HOME}/info/info-%d{yyyy-MM-dd}.%i.log</FileNamePattern>--> <!--%d{yyyy-MM,aux}/info-%d{yyyy-MM-dd}-%i.log--> <!--日志文件保留天数--> <MaxHistory>90</MaxHistory> <MaxFileSize>10MB</MaxFileSize> </rollingPolicy> <!--过滤器,只打INFO级别的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <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> <charset>UTF-8</charset> <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern>--> </encoder> <!--<!–日志文件最大的大小–>--> <!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">--> <!--<MaxFileSize>10MB</MaxFileSize>--> <!--</triggeringPolicy>--> </appender> <!--ERROR 日志记录--> <appender name="LOG_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM, aux}/error/error-%d{yyyy-MM-dd}.%i.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>90</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} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!--过滤器,只打ERROR级别的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!--日志文件最大的大小--> <!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">--> <!--<MaxFileSize>10MB</MaxFileSize>--> <!--</triggeringPolicy>--> </appender> <!--<!– show parameters for hibernate sql 专为 Hibernate 定制 –>--> <!--<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />--> <!--<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />--> <!--<logger name="org.hibernate.SQL" level="DEBUG" />--> <!--<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />--> <!--<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />--> <!--myibatis log configure--> <logger name="com.apache.ibatis" level="DEBUG"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <logger name="java.sql.CallableStatement" level="DEBUG"/> <!--开发环境--> <springProfile name="dev"> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="LOG_INFO"/> <appender-ref ref="LOG_WARN"/> <appender-ref ref="LOG_ERROR"/> </root> </springProfile> <!--测试环境--> <springProfile name="test"> <!-- 日志输出级别 --> <root level="INTO"> <appender-ref ref="STDOUT"/> <appender-ref ref="LOG_INFO"/> <appender-ref ref="LOG_WARN"/> <appender-ref ref="LOG_ERROR"/> </root> </springProfile> <!--生产环境--> <springProfile name="prod"> <!--<!– 日志输出级别 –>--> <root level="INTO"> <appender-ref ref="LOG_INFO"/> <appender-ref ref="LOG_WARN"/> <appender-ref ref="LOG_ERROR"/> </root> </springProfile> <!--标准格式: 日志输出级别 --> <!--<root level="INFO">--> <!--<appender-ref ref="STDOUT"/>--> <!--<appender-ref ref="LOG_INFO"/>--> <!--<appender-ref ref="LOG_ERROR"/>--> <!--</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>

本文介绍了SpringBoot使用Logback时日志按天或月切分不生效的两个原因及解决办法。原因一是使用了错误的rollingPolicy,需将`TimeBasedRollingPolicy`替换为`SizeAndTimeBasedRollingPolicy`;原因二是`FileNamePattern`中使用多个'%d'未添加'aux'辅助参数。正确配置应为`%d{yyyy-MM,aux}`。"
127459415,8365666,世界象棋锦标赛网络图绘制教程,"['数据可视化', 'Python编程', '网络图绘制', '数据读取', '图形布局']
1959





