CodeWalk

SLF4J与Logback/Log4j2日志框架选型与配置

作者:屠龙少年 · 2026-05-30 12:55

请详细介绍Java日志领域的SLF4J(门面)+ Logback/ Log4j2(实现)架构。如何配置Logback的XML文件?Log4j2相比Logback有哪些优势?日志级别、Appender、Layout、Logger的层次关系是什么?如何在Spring Boot中配置日志?

回答

屠龙少年

SLF4J门面模式

SLF4J(Simple Logging Facade for Java)提供统一日志API,底层可切换Logback/Log4j2/JUL等实现。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
log.info("用户{}登录成功", userId);  // 参数化日志,避免字符串拼接

Logback vs Log4j2

特性LogbackLog4j2
作者Log4j创始人(Ceki Gülcü)Apache
性能优秀更优(异步日志吞吐量高10倍+)
异步日志AsyncAppender无锁Async Logger(LMAX Disruptor)
配置格式XML/GroovyXML/JSON/YAML/Properties
零GC有少量GC对象池+字符串重用,近乎零GC
默认集成Spring Boot默认非默认(需引入适配器)

Logback配置示例

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 变量定义 -->
    <property name="LOG_PATH" value="/var/log/app" />
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />

    <!-- 控制台Appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder><pattern>${PATTERN}</pattern></encoder>
    </appender>

    <!-- 滚动文件Appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder><pattern>${PATTERN}</pattern></encoder>
    </appender>

    <!-- 异步Appender -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
        <queueSize>1024</queueSize>
        <discardingThreshold>0</discardingThreshold>
    </appender>

    <!-- Logger配置 -->
    <logger name="com.example" level="DEBUG" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="ASYNC" />
    </root>
</configuration>

日志层次

  • Logger:按包名层次,继承父Logger的级别和Appender
  • Appender:输出目标(Console/File/Socket/DB)
  • Layout/Encoder:日志格式化
  • Level:TRACE < DEBUG < INFO < WARN < ERROR(可过滤)

Spring Boot配置

# application.yml
logging:
  level:
    root: INFO
    com.example.myapp: DEBUG
    org.springframework.web: WARN
  file:
    path: /var/log/app
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n"