07、Springboot日志使用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 07、Springboot日志使用

一、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-web—Spring-boot-starter—spring-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中查看下日志依赖的图表:



log4j-to-slf4j、jul-to-slf4j都是slf4j的桥接器(分别是log4j与JDK自带日志的slf4j实现)。

log4j-api:Log4j2的日志门面。

slf4j-api:日志门面。

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



说明:在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");
    }
}



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



2.2、application.properties配置日志格式


配置+测试程序



本文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);
       }
   }
}



控制台输出内容:



输出到文件内容:



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




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配置实例



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配置ConsoleAppender、FileAppender,关闭继承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);
        }
    }
}



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



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

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


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


答:logback-spring.xml中我们能够根据application.properties中spring.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);
        }
    }
}




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


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



报错信息说初始化时配置出现null!


注意点

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


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


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


运行程序会出现以下情况:


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




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



一定要注意!!!



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


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



①首先移除原先的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>


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




log4j-core、log4j-api:log4j的核心jar包以及日志门面。

log4j-slf4j-impl:slf4j针对于log4j2的接口实现类jar包。

log4j-jul、jul-to-slf4j:log4j-jul不太清楚,jul-to-slf4j是slf4j针对于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);
        }
    }
}



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



总结


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


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


3、Springboot中配置文件方式两种,第一种是在application.properties中进行简单配置;第二种是自定义配置文件可以使用logback.xml或logback-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部分

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
77 5
|
29天前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
35 1
|
1月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
47 1
|
2月前
|
Java Maven Spring
SpringBoot日志整合
SpringBoot日志整合
30 2
|
2月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
199 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
2月前
|
SQL XML 监控
SpringBoot框架日志详解
本文详细介绍了日志系统的重要性及其在不同环境下的配置方法。日志用于记录系统运行时的问题,确保服务的可靠性。文章解释了各种日志级别(如 info、warn、error 等)的作用,并介绍了常用的日志框架如 SLF4J 和 Logback。此外,还说明了如何在 SpringBoot 中配置日志输出路径及日志级别,包括控制台输出与文件输出的具体设置方法。通过这些配置,开发者能够更好地管理和调试应用程序。
|
3月前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
288 1
|
4月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
4月前
|
监控 Java Serverless
美团 Flink 大作业部署问题之想在Serverless平台上实时查看Spring Boot应用的日志要怎么操作
美团 Flink 大作业部署问题之想在Serverless平台上实时查看Spring Boot应用的日志要怎么操作
|
4月前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
下一篇
DataWorks