大数据、Java EE 学习资料请关注 B 站:https://space.bilibili.com/204792350

SpringBoot 日志系统配置及使用(slf4j、logback、log4j2)

日志框架

门面:

  • JCL(Jakarta Commons Logging)
  • SLF4J(Simple Logging Facade for Java)
  • jboss-logging

实现:

  • slf4j
  • jul(java.util.logging)
  • slf4j2
  • logback

SpringBoot 使用的是:slf4j + logback

Spring 底层默认使用:JCL

处理依赖

SpringBoot 默认方案是:slf4j+logback

一个简单例子,使用的时候是调用 slf4j 提供的工厂类来使用日志实现类,而不是直接调用实现类。

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");
  }
}

除了默认的方案,通过官方提供的图片,还有其他的搭配方案,如下图:
concrete-bindings

解析:

  • 浅蓝色的表示抽象层,也就是接口
  • 深蓝色的表示实现类
  • 假蓝色的表示适配层,作为一个中间层存在
  • 灰色的表示出现时期比 slf4j 要早

一共有 6 套方案:

  • 未绑定其他实现类,所以无法输出
  • slf4j + logback
  • slf4j + log4j:需要适配层
    • slf4j-log412.jar
  • slf4j + java.util.logging:需要适配层
    • slf4j-jdk14.jar
  • slf4j + simple
  • slf4j + no-operation

遗留问题

这种问题来自于不同的框架或者一些依赖,尤其是 SpringBoot 和 Spring,这两个使用的日志框架是不同的。所以想要将一个应用中统一使用一种日志框架,就必须要有另外的实现技术。恰好,slf4j 就提供了这种解决方案。

简单的看下如图:

legacy

解决方案:

  • 使用 logback-classic
    • 将 commons-logging、log4j、java.util.logging 转换为 slf4j,需要三个适配层
      • **commons-logging:**jcl-over-slf4j.jar
      • **log4j:**log4j-over-slf4j.jar
      • **java.util.logging:**jul-to-slf4j.jar
  • 使用 log4j
    • 将 commons-logging、java.util.logging 转换为 slf4j,需要两个适配层
      • **commons-logging:**jcl-over-slf4j.jar
      • **java.util.logging:**jul-to-slf4j.jar
      • slf4j-log4j12.jar
  • 使用 java.util.logging
    • 将 commons-logging、log4j 转换为 slf4j,需要两个适配层
      • **commons-logging:**jcl-over-slf4j.jar
      • **log4j:**log4j-over-slf4j.jar
      • slf4j-jdk14.jar

一个有三套方案,不同的日志实现,会有不同的排除依赖,其实很简单,就是将原本的依赖排除调用,使用 slf4j 提供的适配层,这个适配层里面的方法,包名等等都与原本的包一致,不同的是方法里面的代码实际调用的是 slf4j 的接口实现。

简单的三步骤:

  • 将其他日志框架排除
  • 导入相应的中间适配层
  • 选择 slf4j 为抽象层的方案作为日志实现

注意:使用其中一套方案的时候,一定要排除其他日志框架。

日志使用

在处理好依赖之后,通过 slf4j 提供的工厂类就可以使用日志实现类了。

@Test
public void testLogger() {
    Logger logger = LoggerFactory.getLogger(LearningApplicationTests.class);

    logger.trace("trace 级别。。。。。。");
    logger.debug("debug 级别。。。。。。");
    logger.info("info 级别。。。。。。");
    logger.warn("warn 级别。。。。。。");
    logger.error("error 级别。。。。。。");
}

通过 LoggerFactory 工厂类,获取日志记录器,调用特定含义的方法可以记录信息。同时,该日志框架是由级别的概念的,通过在配置文件中设置,可以屏蔽不需要输出的信息,就无需注释代码,这在上线的项目中尤其有用。

日志级别由高到低:

  • trace
  • debug
  • info
  • warn
  • error

SpringBoot 默认输出级别从 info 开始,可以在配置文件中单独设置哪些包输出的级别。

logging.level.[包名]=trace

根据不同的日志系统,将加载以下对应的配置文件:

日志系统定制
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging)logging.properties

对于上面的文件名,springboot 推荐使用带有 spring 的文件名,因为这样可以避免被日志系统直接加载。SpringBoot 来加载这些带有 spring 的配置文件,会提供一些高级特性。

例如,可以按环境不同来设置日志格式:

<springProfile name="dev">
	在 dev 环境下生效
</springProfile>
<springProfile name="prod">
	在 prod 环境下生效
</springProfile>

日志格式

  • %d:表示日期时间
    • %d
  • %thread:线程名称
  • %-5level:日志级别,-5 从左往右显示 5 个字符
  • %logger:logger 是使用记录器时传入的 class
    • %logger{90},最多显示 90 个字符
  • %msg:日志记录信息
  • %n:换行
  • %clr:颜色
    • %clr(%d)
    • 支持颜色和样式:blue、cyan、faint、green、magenta、red、yellow

相关信息:

  • 通过设置:org.springframework.boot.logging.LoggingSystem,可以强制 springboot 使用指定的日志系统,也可以设置 none,禁用日志系统。

切换日志系统

SpringBoot 默认的日志系统是:slf4j+logback,若是有需要,可以将其更换其他搭配。

如,将 logback 更换为 log4j,要做到这一点,需要几个步骤:

  • 将 log4j-over-slf4j.jar 依赖排除
  • 导入 slf4j-log4j12.jar 适配层
  • 导入 jcl-over-slf4j.jar、jul-to-slf4j.jar 适配层

当然,上面的做法是无意义了,比起 logback,log4j 是比较差的。

主要的关注点是切换 log4j2 这套新的日志系统。

更换更简单,只要将 spring-boot-starter-logging 整个依赖在当前项目排除(重点)是当前项目,而不是 springboot 仲裁中心。

然后引入,spring-boot-starter-log4j2,这样,项目中日志系统切换完成了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

只要在类路径下放置:log4j2-spring.xml 配置文件,就可以设置格式等等之类的。

由于日志记录是在创建ApplicationContext之前初始化的,因此无法从Spring @Configuration文件中的@PropertySources控制日志记录。更改日志记录系统或完全禁用它的唯一方法是通过系统属性。

常用配置

配置项示例描述
logging.level.*logging.level.com.huasio=trace默认:info,设置日志输出的级别,* 代表着自定义包名。
logging.file.namelogging.file.name=/spring/test.log设置日志输出到指定文件中。
logging.file.pathlogging.file.path=/spring/默认文件名:spring.log设置日志输出到指定目录,与 logging.file.name 配置冲突,同时存在时,该配置不生效。
logging.pattern.consolenone日志输出到控制台的格式
logging.pattern.filenone日志输出到文件的格式
logging.exception-conversion-wordnone记录异常时使用的转换字。
logging.file.clean-history-on-startnone是否在启动时清除存档日志文件(如果启用了LOG_FILE)。
仅默认的Logback设置受支持。
logging.file.max-sizenone最大日志文件大小(如果启用了LOG_FILE)。
仅默认的Logback设置受支持。
logging.file.max-historynone要保留的最大归档日志文件数(如果启用了LOG_FILE)。
仅默认的Logback设置受支持。
logging.file.total-size-capnone要保留的日志备份的总大小(如果启用了LOG_FILE)。
仅默认的Logback设置受支持。
logging.pattern.dateformatnone记录日期格式的附加模式。
仅默认的Logback设置受支持。
logging.pattern.rolling-file-namenone过渡日志文件名的模式
默认:$.%d.%i.gz
仅默认的Logback设置受支持。
PIDnone当前进程ID(如果可能,并且尚未定义为OS环境变量时,将被发现)
logging.grouplogging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
logging.level.tomcat=TRACE
定义日志组,作用是在需要定义相关包的级别的时候,可以使用该配置,进行统一配置。

扩展

# Spring   框架   SpringBoot   Log4j   slf4j   日志系统  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×