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

基于Logback实现不同日志级别分文件输出并保留ConsoleAppender

Complete Logback Configuration for Level-Specific File Logging + Console Output

Got it, let's put together a fully functional Logback configuration that does exactly what you need: splits Info, Warn, and Error logs into separate files, while keeping all logs flowing to the console. Here's the full setup, followed by a breakdown of key parts:

<configuration>
    <!-- Console Appender (keeps all log levels enabled) -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{35}) - %msg %n</pattern>
        </encoder>
    </appender>

    <!-- Info-Only File Appender -->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- Filter to only accept INFO level logs -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- Rolling policy: daily rotation, keep 30 days of history -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/info/info-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <!-- Warn-Only File Appender -->
    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/warn/warn-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <!-- Error-Only File Appender -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/error/error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <!-- Root Logger: Attach all appenders, set base level to INFO -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE_INFO"/>
        <appender-ref ref="FILE_WARN"/>
        <appender-ref ref="FILE_ERROR"/>
    </root>
</configuration>

Key Details Explained:

  • Console Appender (STDOUT): Kept exactly as you provided—this will output all log levels (Info, Warn, Error, plus any lower levels if you adjust the root level) to the console with your formatted pattern.
  • Level-Specific Filters: Each file appender uses a LevelFilter to strictly only accept logs of its target level. ACCEPT lets matching logs pass through, DENY blocks everything else, so no cross-contamination between files.
  • Rolling File Policy: Each appender uses TimeBasedRollingPolicy to rotate logs daily, keep 30 days of history, and cap total log size at 1GB to prevent disk bloat. Tweak these values based on your storage needs.
  • Root Logger Setup: The root logger is set to INFO (so all Info, Warn, Error logs are captured) and attaches all four appenders—ensuring every log goes to the console and its respective level file.

If you need to target specific packages instead of the entire application, you can add a dedicated <logger> element like this:

<logger name="com.yourpackage" level="INFO" additivity="false">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="FILE_INFO"/>
    <appender-ref ref="FILE_WARN"/>
    <appender-ref ref="FILE_ERROR"/>
</logger>

Set additivity="false" to avoid duplicate logs from the root logger.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:14:47