Spring Boot 日志
使用日志框架来帮助我们记录系统运行情况,比如当系统发生异常信息,运行正常的信息等等都可以记录,便于系统维护。
Logback日志框架
logback是在java社区被广泛使用的一种日志框架。logback的前生是log4j。相比log4j而言,logback可以更快实现并且提供更多的选项和灵活的配置。
除了使用LogBack,我们还要使用SLF4J来作为LogBack的接口。不过SPring Boot 框架已经帮助我们集成这些依赖。
Logback的体系结构
三个类类组成了logback的体系结构:Logger、Appender、Layout.
- Logger:日志信息容器
- Appender 日志信息位于什么地方。比如控制台、文件等等。
- Layout:日志信息输出格式。
开始Coding
在开始编程时,我们需要在 resources 目录添加 logback.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
开始测试
@SpringBootTest
class WecatorderApplicationTests {
private final static Logger logger = LoggerFactory.getLogger(WecatorderApplication.class);
@Test
void contextLoads() {
logger.info("Example log from {}", "hello logger");
}
}
Logger Context
初始化一个logger通过 SLF4J 或者 Logback
private static final Logger logger
= LoggerFactory.getLogger(Test.class);
logger是有继承关系的
比如,Example类位于com.test.logback包下。另一个ExampleAppender位于com.test.logback.appenders包下。那么ExampleAppender的logger是Example的logger的孩子。
所有的logger都是预先定义root logger的后代
每个logger都一个级别,可以配置级别在配置文件中,也可以通过编程Logger.setLevel()来设置级别。通过代码设置会覆盖配置文件中级别
级别的优先级:ERROR>WARN>INFO>TRACE
等级越高先输出
如果一个logger没有显示指定级别,它将继承最近的祖先的级别
ch.qos.logback.classic.Logger parentLogger =
(ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback");
parentLogger.setLevel(Level.INFO);
Logger childlogger =
(ch.qos.logback.classic.Logger)LoggerFactory.getLogger("com.baeldung.logback.tests");
parentLogger.warn("This message is logged because WARN > INFO.");
parentLogger.debug("This message is not logged because DEBUG < INFO.");
childlogger.info("INFO == INFO");
childlogger.debug("DEBUG < INFO");
输出信息
20:31:29.586 [main] WARN com.baeldung.logback - This message is logged because WARN > INFO.
20:31:29.594 [main] INFO com.baeldung.logback.tests - INFO == INFO
childlogger并没有显示指定Level,childlogger是继承parentLogger,所以childlogger也具有INFO级别,所以只会打印级别大于等于INFO的日志
Appenders
ConsoleAppender
使用ConsoleAppender输出信息到控制台上
FileAppender
使用FileAppender输出信息到文件
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>tests.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
RollingFileAppender
有时我们并不需要把日志信息都追加到同一个文件中。我需要在按时回滚文件,或者按文件大小回滚。那就需要用到RollingFileAppender了
<property name="LOG_FILE" value="LogFile" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
RollingFileAppender提供回滚策略以满足不同回滚需求,当达到3GB时,会采用FIFO的删除前面归档的文件
Layouts
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
参数含义:
- %d{HH:mm:ss.SSS}:时间戳,时,分,秒和毫秒
- [%thread]:线程名
- %-5level:日志级别,填充5个字符
- %logger{36}:logger名字(类名),截断36个字符
- %msg%n:日志信息以及换行