SpringBoot日志
日志框架的分类和选取
常见的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j….
|
日志门面 (日志的抽象层) |
日志实现 |
|
JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、 jboss-logging |
Log4j、JUL(java.util.logging)、Log4j2、Logback |
左边选一个门面(抽象层)、右边来选一个实现;
日志门面: SLF4J;
日志实现:Logback;
SpringBoot:底层是Spring框架,Spring框架默认是用JCL;
SpringBoot选用 SLF4j和logback;
如何在系统中使用SLF4j
在开发的时候,日志记录方法的调用,不应该直接来调日志的实现类,而是调用日志抽象层里面的方法
给系统里面导入slf4j的jar和logback的实现jar
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
图示:

每一个日志的实现框架都有自己的配置文件,使用slf4j以后,配置文件还是使用日志实现框架自己的配置文件
遗留问题
在一个项目中,我们使用了slf4j+logback做日志记录。但是我们可能还会用到Spring框架,Hibernate框架和MyBatis框架,他们所用的日志框架又各不相同,比如spring使用commons-logging,Hibernate可能使用jboss-logging等,那么这就显得非常混乱了,这时候我们就需要将日志框架统一,统一使用slf4j

如何让系统中所有的日志都统一到slf4j
-
将系统中其他日志框架先排除出去
-
用中间包来替换原有的日志框架
-
我们导入slf4j实现
上面的三步的解释是:例如spring框架使用的是commons-logging,那么Spring框架里面相关的日志记录方法一定也是使用的commons-logging的,那么如果这时去掉commons-logging加入别的日志框架就一定会报错,因为不同的框架使用的方法不同,而spring框架里面还是用的commons-logging的方法。那么应该怎么办呢?又不能去更改spring的源码,那这个问题就显得非常棘手了。不过好在也不是真的没有解决办法,如果在slf4j与spring框架中间再添加一个包,这个包里面有所有原来commons-logging的方法,但是这些方法却是由slf4j实现的,那不就将问题解决了?掩住了spring的耳目使用了slf4j了!那么接下来就来看看SpringBoot的日志底层依赖吧
SpringBoot的日志底层依赖关系

总结:
-
SpringBoot底层也是使用slf4j+logback的方式进行日志记录
-
SpringBoot已经把其他的日志替换成了slf4j
-
如果我们要引入其他框架,一定要把这个框架默认的日志依赖包移除掉
就上面第三点以在SpringBoot中使用spring为例,看看是怎样排除日志依赖包的
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
SpringBoot做日志的核心总结:SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志。引入其他框架的时候。只需要把这个框架依赖的日志框架排除掉,不用再做其他的任何操作
日志的使用
默认配置
SpringBoot默认帮我们配置好了日志,我们直接使用
// 记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
// 日志级别, 由低到高 trace < debug < info < warn < error
// 可以通过调整日志级别来输出这个级别及以上的级别的日志
// SpringBoot默认使用的是info级别,没有指定级别就是用默认规定的级别,即root级别
logger.trace("这是trace日志。。。");
logger.debug("这是debug日志。。。");
logger.info("这是info日志。。。");
logger.warn("这是warn日志。。。");
logger.error("这是error日志。。。");
}
在properties中配置日志级别
logging.level.com.jinxin=trace # 配置级别为trace,这里是将com.jinxin包下面的所有类的级别调成trace级别
logging.file=springboot.log # 指定日志输出文件,默认在当前项目下生成,也可以指定路径,如:G:/springboot.log
# logging.path与logging.file是一对冲突设置,指定路径时二者选其一就好,一般选择logging.path
# /表示在当前磁盘的根目录下创建目录,默认以springboot.log作为日志记录
logging.path=/spring/log
# 在控制台输出的日志格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 在文件中输出的日志格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
指定配置
给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了
|
Logging System |
Customization |
|
Logback |
logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy |
|
Log4j2 |
log4j2-spring.xml or log4j2.xml |
|
JDK (Java Util Logging) |
logging.properties |
logback.xml:直接就被日志框架识别了;
logback-spring.xml:不会直接被日志框架识别,由SpringBoot解析日志配置,可以使用SpringBoot的高级profile功能
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
可以指定某段配置只在某个环境下生效
</springProfile>
例如在logback-spring.xml中指定不同的开发环境输出不同的格式
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!-- 日志输出格式: %d表示日期时间, %thread表示线程名, %-5level:级别从左显示5个字符宽度 %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息, %n是换行符 --> <layout class="ch.qos.logback.classic.PatternLayout"> <springProfile name="dev"> <!-- 开发环境怎样输出 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern> </springProfile> <springProfile name="!dev"> <!-- 非开发环境怎样输出 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern> </springProfile> </layout> </appender>
注意:想要使用上述的SpringBoot的profile功能,那么配置文件就必须命名为logback-spring.xml,如果命名为了logback.xml还使用了profile功能,那么日志框架就会报错,说找不到这个功能 no applicable action for [springProfile]
由此可见配置文件命名为logback.xml跟logback-spring.xml的区别,即使用logback.xml的时候是将文件交给日志框架处理的,而使用logback-spring.xml的时候是将文件交给springBoot处理的
切换日志框架(不推荐)
我们可以按照slf4j的日志适配图,进行相关的切换;
例如将SpringBoot底层的日志框架切换成 slf4j+log4j
在pom.xml中导入依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
如果要将日志框架更换为log4j2也可以使用同样的方式
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

浙公网安备 33010602011771号