如何配置Logback按包拆分日志并修复仅spring.log写入异常
Fix Logback Configuration to Split Logs into Four Files
我帮你梳理了下当前Logback配置里的问题,这几个点是导致只有spring.log有内容的关键,下面是修复方案和详细解释:
核心问题分析
- 滚动日志文件名冲突:所有Appender的
fileNamePattern都用了logFile.%d{yyyy-MM-dd}.log,这会让不同日志的滚动文件互相覆盖,甚至干扰初始日志文件的写入逻辑。 - 日志传递未控制:默认
additivity="true"会让日志向上传递到父Logger,若没有配置Root Logger,部分日志可能无法正确路由;同时不关闭传递的话,还可能出现日志重复写入的情况。 - Tomcat日志的Logger名称不对:Tomcat的核心日志类大多在
org.apache.catalina、org.apache.coyote包下,而非org.apache.tomcat,所以当前配置捕获不到Tomcat的日志。 - Logger包路径可能不匹配:如果你的DAO/Service类不在
com.example.dao/com.example.service包下,对应的Logger就不会生效。
修复后的完整配置
<configuration scan="true"> <!-- DAO日志Appender --> <appender name="daoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/dao.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 修正滚动文件名,避免冲突 --> <fileNamePattern>logs/dao.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <charset>UTF-8</charset> <pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n </pattern> </encoder> </appender> <!-- Service日志Appender --> <appender name="serviceLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/service.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/service.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <charset>UTF-8</charset> <pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n </pattern> </encoder> </appender> <!-- Spring日志Appender --> <appender name="springLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/spring.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/spring.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <charset>UTF-8</charset> <pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n </pattern> </encoder> </appender> <!-- Tomcat日志Appender --> <appender name="serverLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/server.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/server.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <charset>UTF-8</charset> <pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n </pattern> </encoder> </appender> <!-- DAO Logger:关闭日志传递,确保只写入daoLog --> <logger name="com.example.dao" level="INFO" additivity="false"> <appender-ref ref="daoLog" /> </logger> <!-- Service Logger --> <logger name="com.example.service" level="INFO" additivity="false"> <appender-ref ref="serviceLog" /> </logger> <!-- Spring Logger --> <logger name="org.springframework" level="INFO" additivity="false"> <appender-ref ref="springLog" /> </logger> <!-- Tomcat Logger:匹配Tomcat核心包路径 --> <logger name="org.apache.catalina" level="INFO" additivity="false"> <appender-ref ref="serverLog" /> </logger> <logger name="org.apache.coyote" level="INFO" additivity="false"> <appender-ref ref="serverLog" /> </logger> <!-- Root Logger:兜底处理未匹配的日志,可选控制台输出便于调试 --> <root level="INFO"> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <charset>UTF-8</charset> <pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n </pattern> </encoder> </appender> </root> </configuration>
关键修改说明
- 滚动文件名修正:每个Appender的
fileNamePattern改为对应日志的前缀(比如logs/dao.%d{yyyy-MM-dd}.log),彻底解决滚动文件冲突问题。 - 关闭日志传递:给每个业务Logger添加
additivity="false",避免日志被父Logger重复处理,确保日志只写入目标文件。 - 修正Tomcat Logger路径:添加
org.apache.catalina和org.apache.coyote的Logger,正确捕获Tomcat的启动、运行日志到server.log。 - 明确日志级别:给每个Logger指定
level="INFO"(可根据需求调整为DEBUG/WARN等),确保日志输出符合预期。 - 添加Root Logger:作为兜底,处理所有未匹配到上述Logger的日志,配置控制台输出方便调试。
验证步骤
- 确认你的DAO/Service类确实在对应的包下,且代码中使用了SLF4J的Logger(比如
private static final Logger logger = LoggerFactory.getLogger(YourDaoClass.class);)。 - 启动应用后,触发DAO/Service层的异常,检查对应的日志文件是否有内容。
- 查看Tomcat的启动日志和请求日志,确认server.log是否捕获到相关内容。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

