Java 日志框架简介(JUL / Log4j / SLF4J)
日志是应用程序的重要组成部分。理解日志框架的使用是进行调试和监控的关键。本章将详细介绍 Java 中的日志框架。
常用 Java 日志框架
JUL
JUL(Java Util Logging)是 Java 自带的日志框架。使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。
特点:
- Java 标准库,无需额外依赖
- 功能简单
- 配置相对复杂
import java.util.logging.Logger;
import java.util.logging.Level;
public class JULExample {
private static final Logger logger = Logger.getLogger(JULExample.class.getName());
public static void main(String[] args) {
logger.info("信息日志");
logger.warning("警告日志");
logger.severe("严重错误日志");
// 使用 Level
logger.log(Level.INFO, "信息日志");
logger.log(Level.WARNING, "警告日志");
}
}
Log4j
Log4j 是 Apache 下的一款开源的日志框架。它有一个升级版本 Log4j2,参考了 Logback 的一些优秀的设计,并且修复了一些问题。
特点:
- 功能强大
- 配置灵活
- 性能好
import org.apache.log4j.Logger;
public class Log4jExample {
private static final Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.debug("调试日志");
logger.info("信息日志");
logger.warn("警告日志");
logger.error("错误日志");
}
}
SLF4J
SLF4J(Simple Logging Facade for Java)是日志门面,提供统一的日志接口。学过设计模式的同学都会知道在 23 种设计模式中有一种模式叫 门面模式 或 外观模式(Facade),这意味着 SLF4J 充当不同日志框架门面的角色,让用户可以自由切换底层的日志实现。
特点:
- 日志门面,不实现日志
- 可以切换底层日志实现
- 推荐使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
private static final Logger logger = LoggerFactory.getLogger(SLF4JExample.class);
public static void main(String[] args) {
logger.debug("调试日志");
logger.info("信息日志");
logger.warn("警告日志");
logger.error("错误日志");
}
}
日志等级与配置
日志等级
日志等级(从低到高):
- TRACE:最详细的日志
- DEBUG:调试信息
- INFO:一般信息
- WARN:警告信息
- ERROR:错误信息
SLF4J 配置(logback)
logback.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!-- 特定包的日志级别 -->
<logger name="com.example" level="DEBUG"/>
</configuration>
Log4j2 配置
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- 控制台输出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!-- 文件输出 -->
<RollingFile name="File" fileName="logs/application.log"
filePattern="logs/application-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<!-- 根日志级别 -->
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
<!-- 特定包的日志级别 -->
<Logger name="com.example" level="DEBUG"/>
</Loggers>
</Configuration>