SLF4J与Logback/Log4j2日志框架选型与配置
请详细介绍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
| 特性 | Logback | Log4j2 |
|---|---|---|
| 作者 | Log4j创始人(Ceki Gülcü) | Apache |
| 性能 | 优秀 | 更优(异步日志吞吐量高10倍+) |
| 异步日志 | AsyncAppender | 无锁Async Logger(LMAX Disruptor) |
| 配置格式 | XML/Groovy | XML/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"