You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Logback按包拆分日志并修复仅spring.log写入异常

Fix Logback Configuration to Split Logs into Four Files

我帮你梳理了下当前Logback配置里的问题,这几个点是导致只有spring.log有内容的关键,下面是修复方案和详细解释:

核心问题分析

  1. 滚动日志文件名冲突:所有Appender的fileNamePattern都用了logFile.%d{yyyy-MM-dd}.log,这会让不同日志的滚动文件互相覆盖,甚至干扰初始日志文件的写入逻辑。
  2. 日志传递未控制:默认additivity="true"会让日志向上传递到父Logger,若没有配置Root Logger,部分日志可能无法正确路由;同时不关闭传递的话,还可能出现日志重复写入的情况。
  3. Tomcat日志的Logger名称不对:Tomcat的核心日志类大多在org.apache.catalina、org.apache.coyote包下,而非org.apache.tomcat,所以当前配置捕获不到Tomcat的日志。
  4. 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的日志,配置控制台输出方便调试。

验证步骤

  1. 确认你的DAO/Service类确实在对应的包下,且代码中使用了SLF4J的Logger(比如private static final Logger logger = LoggerFactory.getLogger(YourDaoClass.class);)。
  2. 启动应用后,触发DAO/Service层的异常,检查对应的日志文件是否有内容。
  3. 查看Tomcat的启动日志和请求日志,确认server.log是否捕获到相关内容。

内容的提问来源于stack exchange,提问作者Danny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:17:50