Java中Logback配置每小时生成新归档日志文件问题排查
修正Logback配置实现每小时归档且保留所有日志
原配置的核心问题
- 时间滚动格式错误:
%d{yyyy-MM-dd HH:mm}会触发每分钟归档,而非每小时,不符合需求 - 自动删除归档的配置:
maxHistory和totalSizeCap会自动清理旧日志,违反“不得删除任何归档”的要求 - 重复Logger配置:两个
com.credenceLogger会导致配置冲突,且未覆盖全量微服务日志
修正后的完整配置
<property name="LOG_FILE" value="logs/campaign-service.log"/> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern> %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{0} - %msg%n </Pattern> </layout> </appender> <appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 按小时归档,格式精确到小时 --> <fileNamePattern>logs/archived/campaign-service.%d{yyyy-MM-dd_HH}.log</fileNamePattern> <!-- 移除maxHistory和totalSizeCap,避免自动删除归档 --> </rollingPolicy> <encoder> <pattern>%d [%t] %p %c{0} %m%n</pattern> </encoder> </appender> <!-- 合并重复的com.credence日志配置,同时输出到控制台和文件 --> <logger name="com.credence" level="trace" additivity="false"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE-ROLLING"/> </logger> <!-- Spring框架日志输出到控制台,如需写入文件可添加FILE-ROLLING引用 --> <logger name="org.springframework" level="info" additivity="false"> <appender-ref ref="STDOUT"/> </logger> <!-- Root日志输出到控制台,如需全量微服务日志写入文件,添加FILE-ROLLING引用 --> <root level="info"> <appender-ref ref="STDOUT"/> <!-- 如果需要所有日志(包括第三方框架)都写入归档文件,取消下面的注释 --> <!-- <appender-ref ref="FILE-ROLLING"/> --> </root>
关键配置说明
- 时间滚动格式:
%d{yyyy-MM-dd_HH}确保每小时生成一个归档文件,文件名会包含具体的年-月-日-小时,比如campaign-service.2024-05-20_14.log - 移除自动清理配置:删除
maxHistory和totalSizeCap后,Logback不会自动删除任何归档文件,所有历史日志都会保留 - 合并Logger配置:将重复的
com.credenceLogger合并,同时关联控制台和文件输出,避免配置冲突 - 全量日志控制:如果需要将微服务的所有日志(包括Spring等第三方框架)都写入归档文件,只需在Root Logger中添加
FILE-ROLLING的引用即可
内容的提问来源于stack exchange,提问作者Sambhav Jain
相关产品推荐
相关产品推荐

