07、Springboot日志使用

举报
长路 发表于 2022/11/28 08:36:40 2022/11/28
【摘要】 文章目录前言一、Springboot日志介绍二、实际使用(slf4j+logback)2.1、Springboot无配置文件进行日志打印2.2、application.properties配置日志格式2.3、自定义配置文件(常用)①logback.xml配置②logback-spring.xml配置(环境切换用途)注意点三、Springboot中使用Log4j2(未来趋势)总结参考资料 前言 本

@[toc]


前言

本篇文章使用环境如下:

  • IDEA:2020.1
  • Springboot:2.4.3

本篇文章主要介绍Springboot中默认使用的日志门面以及日志框架(slf4j+logback)以及介绍了在Springboot项目中如何配置Log4j2的日志实现!

所有博客文件目录索引(包含日志框架系列学习):博客目录索引(持续更新)


一、Springboot日志介绍

一般现在都是使用Springboot框架,Springboot日志也是开发中常用的日志系统。Springboot默认使用的slf4j作为日志门面,Logback作为日志实现来记录日志。

我们一般创建Springboot项目都是会引入Spring web启动器,在这个启动器坐标中就包含了日志依赖!

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 这个就是Spring web启动器,其中就包含了日志依赖。

spring-boot-starter-webSpring-boot-starterspring-boot-starter-logging,我们通过对应的依赖就能找到其中的日志启动器,接下来我们就看看在Springboot中配置了什么日志依赖、日志实现,首先看下引入的日志启动器坐标:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
  <version>2.4.3</version>
  <scope>compile</scope>
</dependency>

我们在IDEA中查看下日志依赖的图表:

image-20210313193531304

  • log4j-to-slf4jjul-to-slf4j都是slf4j的桥接器(分别是log4jJDK自带日志的slf4j实现)。
  • log4j-api:Log4j2的日志门面。
  • slf4j-api:日志门面。
  • logback-classiclogback-core:则是日志实现框架。

所以由此我们能够知道Springboot底层默认使用slf4j日志门面以及Logback作为日志实现,并且也可以使用log4j2作为日志门面,但是最终依旧也是通过slf4j来调用logback



二、实际使用(slf4j+logback)

2.1、Springboot无配置文件进行日志打印

通过slf4j日志门面默认使用的logback日志实现框架

创建一个Springboot项目,引入Spring web模块,直接进行测试(在test目录中):

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SpringBootTest
class SpingbootlogApplicationTests {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class);

    @Test
    void contextLoads() {
        LOGGER.warn("WARN");
        LOGGER.error("error");
        LOGGER.info("info");//默认日志等级
        LOGGER.debug("debug");
        LOGGER.trace("trace");
    }
}

image-20210313203326399

说明:在Springboot中默认日志等级为INFO,并且日志打印格式包含了年月日时分秒毫秒、日志等级、线程号、线程名(main)、全限定类名以及msg(输出的信息)。


通过log4j2日志门面来进行日志输出(默认还是用logback日志实现框架输出)

解释:虽然使用的是log4j2日志门面,不过底层依旧会使用桥接器(log4j-to-slf依赖引入的实现类)切换为slf4j门面并依旧使用的是Logback日志实现框架输出。

和上面一样,通过测试类进行输出:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@SpringBootTest
class SpingbootlogApplicationTests {
	//通过Log4j2的日志门面来获取Logger
    private static final Logger LOGGER = LogManager.getLogger(SpingbootlogApplicationTests.class);

    @Test
    void contextLoads() {
        LOGGER.warn("WARN");
        LOGGER.error("error");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");
    }

}

image-20210313204545065

与直接使用slf4j日志门面的效果一样,最终还是使用的logback日志实现。



2.2、application.properties配置日志格式

配置+测试程序

image-20210313212551953

本文2.1中是输出日志文件是直接使用的Springboot的默认配置,本部分我们在application.properties中进行简单配置:

# 指定自定义logger对象日志级别
logging.level.xyz.changlu=trace

# 指定控制台输出格式 包含日志等级、年月日时分秒毫秒 全限定类名 方法名 行号 线程名  错误信息
logging.pattern.console=[%-5level] %d{yyyy-MM-dd HH:mm:ss:SSS} %c %M->%L [%thread] ===== %msg %n

# ①指定存放日志文件的具体路径(springboot2.4.3中使用无效)
# logging.file=/logs/logback.log
# ②指定日志文件存放的目录,默认创建文件名为 spring.log (存储路径说明:/对应c:/)
# 若是这两个配置文件路径的参数一起使用时则会默认使用logging.file(不推荐!!!)
logging.file.path=/logs/springboot
# 指定输出到日志文件消息格式
logging.pattern.file=[%-5level] %d{yyyy-MM-dd HH:mm:ss:SSS} %c %M->%L [%thread] ===== %msg %n
  • 自定义Logger日志等级设置。
  • 指定控制台输出的格式。(输出到控制台)
  • 指定文件输出消息格式、存储文件路径。(输出到文件)

程序测试

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SpringBootTest
class SpingbootlogApplicationTests {

   private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class);

   @Test
   void contextLoads() {
       LOGGER.warn("WARN");
       LOGGER.error("error");
       LOGGER.info("info");
       LOGGER.debug("debug");
       LOGGER.trace("trace");
       try {
           int sum = 5/0;
       } catch (Exception e) {
           LOGGER.debug("报错",e);
       }

   }
}

控制台输出内容

image-20210313212741136

输出到文件内容

image-20210313212834161

其他说明:在application.properties中配置的信息比较有限,通常我们使用自定义配置文件来进行日志的配置

image-20210313213012312



2.3、自定义配置文件(常用)

通过application.properties来进行配置日志显然不太够,像一些根据文件大小拆分的RollingFileAppender都不能够进行配置,所以我们一般会通过自定义配置文件来进行配置,常用的不同的日志框架对应使用的配置文件名称如下:

日志框架 配置文件
Logback logback-spring.xml , logback.xml
Log4j2 log4j2-spring.xml , log4j2.xml
JUL logging.properties

可以看到我们使用Logback日志实现框架的配置文件可以是两种名称,使用Logback-spring.xml我们可以根据不同环境的切换来设置不同的日志格式输出,我们在下面介绍。

①logback.xml配置

logback.xml配置实例

image-20210313215624945

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="pattern"  value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>

    <!--  配置ConsoleAppender  -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--  输出流对象(红色)  -->
        <target>System.err</target>
        <!--   日志格式配置   -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--  配置FileAppender  -->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!--  配置文件路径  -->
        <file>d:/logs/logback.log</file>
        <!--  日志格式设置  -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--自定义logger   additivity:表示是否从 rootLogger继承配置-->
    <logger name="xyz.changlu" level="info" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </logger>

</configuration>
  • 简述:使用自定义logger配置ConsoleAppenderFileAppender,关闭继承RootLogger

测试程序

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SpringBootTest
class SpingbootlogApplicationTests {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class);

    @Test
    void contextLoads() {
        LOGGER.warn("WARN");
        LOGGER.error("error");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");
        try {
            int sum = 5/0;
        } catch (Exception e) {
            LOGGER.debug("报错",e);
        }

    }

}

image-20210313215903802

  • 可以看到更改输出流system.err输出的字体为红色了。

image-20210313220003494



②logback-spring.xml配置(环境切换用途)

logback-spring.xml配置(主要说明额外用途)

logback-spring.xml同样也可以进行配置,那么为什么已经有logback.xml进行配置还能使用logback-spring.xml配置呢?

  • 答:logback-spring.xml中我们能够根据application.propertiesspring.profiles.active=dev配置来决定我们的日志格式输出。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BImeH2ud-1615826520263)(C:\Users\93997\AppData\Roaming\Typora\typora-user-images\image-20210313221154810.png)]

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="pattern"  value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>

    <!--  配置ConsoleAppender  -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--  输出流对象(红色)  -->
        <target>System.err</target>
        <!--   日志格式配置   -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--   ***********************************************************   -->
            <!--   根据application.properties中spring.profiles.active=dev配置决定   -->
            <springProfile name="dev">
                <pattern>${pattern}</pattern>
            </springProfile>
            <springProfile name="pro">
                <pattern>%d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level ======= %msg%n</pattern>
            </springProfile>
            <!--   ***********************************************************   -->
        </encoder>
    </appender>

    <!--自定义logger   additivity:表示是否从 rootLogger继承配置-->
    <logger name="xyz.changlu" level="info" additivity="false">
        <appender-ref ref="console"/>
    </logger>

</configuration>
  • 可以看到我们与之前不同的是在11-18行中间多添加了<springProfile>键值对,有什么用途呢?其会根据在application.properties中设置spring.profiles.active=dev键值对来进行选择对应的pattern格式。

application.properties

# 设置为开发环境
spring.profiles.active=dev

# 设置为生产环境
# spring.profiles.active=pro

我们可以通过设置对应的spring.profiles.active值来进行生产、开发环境的切换

测试程序

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SpringBootTest
class SpingbootlogApplicationTests {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class);

    @Test
    void contextLoads() {
        LOGGER.warn("WARN");
        LOGGER.error("error");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");
        try {
            int sum = 5/0;
        } catch (Exception e) {
            LOGGER.debug("报错",e);
        }
    }
}

image-20210313222302877

image-20210313222006937

说明:这个格式与我们在logback-spring.xml中配置的有关,对于输出哪种格式则会与application.properties中键值对指定的有关。

注意点:若是在logback.xml中配置<springProfile>键值对,那么一定要在application.properties中配置spring.profiles.active=devspring.profiles.active=pro,若不配置会报错!!!报错信息如下:

  • image-20210313223213993
  • 报错信息说初始化时配置出现null!


注意点

注意点:当我们使用自定义配置文件时,application.properties配置文件中的日志配置以及spirngboot默认配置不生效!!!

若是自定义配置文件并且不配置任何loggerappender信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

</configuration>

运行程序会出现以下情况

  • logback-spring.xml配置如上信息,运行程序如下:

    • image-20210313223730576
  • logback.xml配置如上信息,运行程序如下:

    • image-20210313223908100

一定要注意!!!



三、Springboot中使用Log4j2(未来趋势)

原本Springboot中默认使用的是slf4j+logback,随着现如今log4j2的强势来袭,之后会慢慢使用slf4j+log4j2的搭配,那么我们如何在Springboot中配置并使用呢?

image-20210313232314618

①首先移除原先的spring-boot-starter-logging坐标依赖,添加新的启动器:spring-boot-starter-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>

<!--     log4j2的相关依赖包含了slf4j对于log4j2的实现类    -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

我们看新引入依赖的结构:

image-20210313230958528

image-20210313231053104

  • log4j-corelog4j-apilog4j的核心jar包以及日志门面。
  • log4j-slf4j-implslf4j针对于log4j2的接口实现类jar包。
  • log4j-juljul-to-slf4jlog4j-jul不太清楚,jul-to-slf4jslf4j针对于jul的桥接器实现slf4j的日志门面API。

这样的话我们就能够使用slf4j+log4j2来进行搭配使用了!

②紧接着我们引入配置文件log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5">
    <!--  日志处理   -->
    <Appenders>
        <!--   控制台输出 appender    -->
        <Console name="Console" target="SYSTEM_ERR">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L ======= %m%n" />
        </Console>
    </Appenders>

    <!--    设置rootLogger    -->
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>
  • 仅在屏幕中打印,并且设置err形式输出日志。

测试程序

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SpringBootTest
class SpingbootlogApplicationTests {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpingbootlogApplicationTests.class);

    @Test
    void contextLoads() {
        LOGGER.warn("WARN");
        LOGGER.error("error");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");
        try {
            int sum = 5/0;
        } catch (Exception e) {
            LOGGER.debug("报错",e);
        }
    }
}

image-20210313232450223

通过这样的方式我们就能够在Springboot中使用log4j2了!!!



总结

1、springboot2.4.3中的spring-boot-starter-webSpring-boot-starterspring-boot-starter-logging的日志启动器中包含依赖有:log4j-to-slf4jjul-to-slf4j(桥接器);log4j-apislf4j-api:日志门面;logback-classiclogback-core:则是日志实现框架。默认使用的是slf4j+logback。—见第1部分

2、Springboot默认日志等级为INFO。—见2.1

3、Springboot中配置文件方式两种,第一种是在application.properties中进行简单配置;第二种是自定义配置文件可以使用logback.xmllogback-spring.xml这两个配置文件都能够进行普通配置。比较特殊的是logback-spring.xml,其可以根据application.properties中的键值对如spring.profiles.active=dev来选择对应环境的自定义输出格式。—见2.2、2.3

  • <!--   logback-spring.xml   -->
    <!--   一但配置了这个springProfile的标签,若不配置application.properties的配置项控制台就会报null错   -->
    <springProfile name="dev">
        <pattern>${pattern}</pattern>
    </springProfile>
    <springProfile name="pro">
        <pattern>%d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level ======= %msg%n</pattern>
    </springProfile>
    
  • # application.properties
    spring.profiles.active=dev
    

4、当进行自定义配置文件时,Springboot的默认配置以及application.properties中的关于日志配置都会无效!!!—见2.3中的注意点

5、若想在springboot中使用log4j2需要先移除掉spring-boot-starter-logging坐标依赖,接着导入spring-boot-starter-log4j2坐标并添加配置文件即可!!!—见第3部分



参考资料

[1] 视频:2020年Java进阶教程,全面学习多种java日志框架

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。