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

Logback配置异常:无法按级别将日志分离到指定文件

Logback配置异常:无法按级别将日志分离到指定文件

嗨,我看到你遇到了Logback日志分离的问题——本来想把INFO级日志写到App.log,ERROR级写到Error.log,结果所有日志都跑到两个文件里去了,咱们来一步步解决它~

先提个小细节:你开头说用的是log4j,但给出的配置是Logback的,不过没关系,咱们就针对这个Logback配置来调整。

原配置的问题所在

你定义了两个同名的<logger name="com">节点,后一个会直接覆盖前一个的配置;更关键的是你的appender没有设置级别过滤规则,不管日志级别是啥,都会被appender接收,这就导致所有日志都被写入两个文件了。

正确的配置方案

我们需要给每个appender添加级别过滤规则,让它们只接收对应级别的日志,然后统一配置logger节点即可。下面是调整后的完整配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 控制台输出Appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{HH:mm:ss.SSS} [%t] %-15level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <!-- Error.log Appender:只接收ERROR级别日志 -->
    <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
        <file>logs/Error.log</file>
        <append>true</append>
        <immediateFlush>true</immediateFlush>
        <encoder>
            <Pattern> %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </Pattern>
        </encoder>
        <!-- 添加级别过滤:只允许ERROR级别通过 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- App.log Appender:只接收INFO级别日志,排除ERROR -->
    <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
        <file>logs/App.log</file>
        <append>true</append>
        <immediateFlush>true</immediateFlush>
        <encoder>
            <Pattern> %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </Pattern>
        </encoder>
        <!-- 先过滤掉ERROR级别 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
        <!-- 只接受INFO级别 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 配置com包下的日志级别,关联所有appender -->
    <logger name="com" level="info" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE1"/>
        <appender-ref ref="FILE2"/>
    </logger>
</configuration>

配置说明

  • FILE1(Error.log)的过滤规则:用LevelFilter指定只接受ERROR级别日志,其他级别直接拒绝,这样只有ERROR日志会写入Error.log。
  • FILE2(App.log)的过滤规则:先添加一个过滤器拒绝ERROR级别,再添加一个过滤器只接受INFO级别,这样只有INFO日志会写入App.log。
  • Logger节点:只保留一个com包的logger,级别设为info(确保INFO及以上级别日志能被处理),additivity="false"避免日志向上传递到root logger重复输出。

这样调整后,就能实现你想要的:INFO级日志到App.log,ERROR级日志到Error.log啦~

备注:内容来源于stack exchange,提问作者Sayantan Maji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 09:33:01