概述
log日志框架为了解决不同的日志实现造成的接口不一致问题,使用facade门面设计模式,通过定义一组抽象api来对客户程序屏蔽不同日志的内部实现差异。
日志门面(日志的抽象层) | 日志实现 |
---|---|
我们通过选择一个左边的门面和右边一个实现即可。
日志门面:SLF4J
日志实现:Log4j2或者logback,目前log4j2更好。
SLF4J使用
- 如何在系统中使用SLF4J
开发中,日记记录方法的调用,不应该直接调用日志实现类,而是通过调用日志抽象层里面的方法。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Wombat {
final Logger logger = LoggerFactory.getLogger(Wombat.class);
Integer t;
Integer oldT;
public void setTemperature(Integer temperature) {
oldT = t;
t = temperature;
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
if(temperature.intValue() > 50) {
logger.info("Temperature has risen above 50 degrees.");
}
}
}
图示如下:
每个日志的实现框架都有自己的配置文件。使用SLF4J以后,配置文件还是使用日志实现框架的配置文件格式。
日志框架统一为SLF4J
比如:A系统(slf4j+logback),spring(commons-logging),xxx
需要把所有的日志框架统一为SLF4J,需要使用SLF4J提供的桥接包。
总结
- 将系统中其他日志框架先排除出去;
- 用中间包来替换原有的日志框架;
- 我们导入SLF4J具体的实现;
Springboot日志关系
- springboot使用的是slf4j+logback的方式进行日志记录;
- springboot通过导入中间替换包把其他的日志框架替换成了slf4j框架。
- 如果我们要引入其他框架,一定要把这个框架的默认日志依赖给排除掉。
因为桥接包的包名和类名与日志框架的包名类名可能相同,导致jar包冲突。
Springboot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志;因此引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可。
日志使用
springboot默认帮我们配置好了日志:
@SpringBootTest
public class TestLog {
private static final Logger logger = LoggerFactory.getLogger(TestLog.class);
@Test
public void test() {
logger.trace("trace level");
logger.debug("debug level");
logger.warn("warn level");
logger.info("info level");
logger.error("error level");
}
}
我们可以在配置文件中指定相应包的日志级别,没有指定的走springboot默认配置的root根logger记录级别。
# 配置日志級別
logging.level.com.practice=trace
打印结果
TestLog in 8.19 seconds (JVM running for 12.556)
2021-04-12 22:35:46.204 TRACE 6620 --- [ main] c.practice.springboot.practice.TestLog : trace level
2021-04-12 22:35:46.204 DEBUG 6620 --- [ main] c.practice.springboot.practice.TestLog : debug level
2021-04-12 22:35:46.204 WARN 6620 --- [ main] c.practice.springboot.practice.TestLog : warn level
2021-04-12 22:35:46.204 INFO 6620 --- [ main] c.practice.springboot.practice.TestLog : info level
2021-04-12 22:35:46.204 ERROR 6620 --- [ main] c.practice.springboot.practice.TestLog : error level
Disconnected from the target VM, address: '127.0.0.1:52858', transport: 'socket'
配置日志文件、路径等
示例:
自定义配置文件
参考springboot官网:springboot官网日志配置
只需要在类路径下添加特定日志框架的配置文件即可,配置文件名称按照官网给出的即可,springboot会使用你自定义的配置而不是默认的了。
- logback.xml:直接被日志框架识别了,会绕过springboot。
- logback-spring.xml:日志框架识别不了,不能直接加载日志的配置项,有springboot解析日志配置,可以使用springboot的高级profile功能(按照指定的环境加载相应的配置)。
切换日志框架
可以更加slf4j官网给日志适配图来进行切换。
- 比如slf4j+log4j的方式:
- 切换为log4j2