下面我来详细讲解 “logback 配置详解(推荐)” 的完整攻略。
1. logback 是什么?
logback 是 Java 世界中广泛使用的日志框架,由 Ceki Gülcü 开发,是 log4j 日志框架的改进版。它支持多种输出方式,具有高效、稳定、高度可配置化等优点,已经在很多大型的 Java 项目中得到应用。
2. logback 的配置方式
logback 的配置文件名是 logback.xml
或 logback.groovy
,放在类路径之下,当运行程序时 logback 会自动读取这个文件进行配置。在配置文件中,有几个常用的基本元素:
<configuration>
:必须是任何配置文件的根元素,在该元素下面定义所有其他元素。<appender>
:日志输出器,负责将日志打印到控制台或文件中等。<logger>
:日志记录器,负责将日志信息输出到对应的 appender 中。
下面是一个 logback 的配置文件示例:
<?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.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/my.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/my.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.example" level="debug">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</logger>
</configuration>
3. logback 的优秀特性
logback 支持日志级别、异步日志、线程特定的日志、条件日志等众多优秀特性。
3.1 日志级别
logback 的日志级别有:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。日志会按照日志级别的高低决定输出的详细度,只输出高于该级别的信息。比如设置日志级别为 INFO,则会输出 WARN、ERROR 和 FATAL 的信息,但不会输出 DEBUG 和 TRACE 的信息。可以通过下面这行代码指定 logback 的日志级别:
<root level="INFO"></root>
3.2 异步日志
logback 可以使用异步操作执行日志,这些日志可以由单独的线程池处理。对于日志频繁的应用程序,异步机制可以提高程序的性能,避免阻塞主线程。下面是关于异步日志的一个示例:
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="console"/>
</appender>
<root level="INFO">
<appender-ref ref="async" />
</root>
3.3 线程特定的日志
logback 支持为每个线程创建一个独立的日志记录器,这个特性可以让程序的日志更加细致地记录下每个线程的状态和行为。线程特定的日志记录器需要在代码中手动创建,示例如下:
public class Example {
private static final Logger logger = LoggerFactory.getLogger(Example.class);
private static final ThreadLocal<String> prefix = new ThreadLocal<>();
public static void setThreadPrefix(String prefix) {
Example.prefix.set(prefix);
}
public void doSomething() {
logger.info(prefix.get() + " doing something");
}
}
使用 ThreadLocal 类来存储线程特定的变量。
3.4 条件日志
logback 的条件日志功能可以使得日志的输出条件更加智能化。比如只在生产环境中输出 ERROR 级别的日志,这个可以通过配置文件(或代码)来决定。
基础配置示例:
<configuration>
<if condition='property("env") == "prod"'>
<then>
<root level="ERROR"/>
</then>
<else>
<root level="DEBUG"/>
</else>
</if>
</configuration>
在这个例子中,logback 根据 property("env")
方法的返回值来决定日志级别,如果返回 prod
表示生产环境,则输出 ERROR 级别的日志;否则输出 DEBUG 级别的日志。
4. logback 配置示例
下面是两个简单的实例,一个是配置输出到控制台,一个是配置输出到文件。
4.1 输出到控制台
<?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.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.example" level="debug">
<appender-ref ref="console"/>
</logger>
</configuration>
在这个配置文件中,我们使用 ConsoleAppender
来配置输出到控制台,将日志输出到 logger
节点中指定的包下面。
4.2 输出到文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/my.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/my.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.example" level="debug">
<appender-ref ref="file"/>
</logger>
</configuration>
在这个配置文件中,我们使用 RollingFileAppender
来配置输出到文件,将日志输出到 logger
节点中指定的包下面,并且还使用了 SizeAndTimeBasedRollingPolicy
来控制日志文件的大小和时间。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:logback 配置详解(推荐) - Python技术站