SpringBoot 日志配置使用

目录

SpringBoot中的日志使用

SpringBoot中的日志设计

▎测试Springboot底层日志实现

SpringBoot 日志配置文件

▎默认配置文件application.properties

▎指定配置文件

使用SpringBoot解析日志配置

☛ 举例说明:

SpringBoot 切换日志实现

▎切换为log4j2日志

▎配置log4j2配置文件


SpringBoot中的日志使用

SpringBoot框架在企业中的使用越来越普遍,SpringBoot日志也是开发中常用的日志系统

SpringBoot 默认就是使用SLF4J作为日志门面,logback作为日志实现来记录日志

SpringBoot中的日志设计

<dependency>
  <artifactId>spring-boot-starter-logging</artifactId>
  <groupId>org.springframework.boot</groupId>
</dependency>

依赖关系图:

1. 新建SpringBoot工程项目

 2. 添加一个web启动器

3. 打开pom.xml文件,选中boot-starter-web启动器,查看maven关系依赖图

4. boot-starter-web 启动器当中,会依赖中我们所使用环境的一些 jar包的信息,里面就包含了slf4j日志门面和logback的日志实现

  总结

  1. SpringBoot底层默认使用logback作为日志实现
  2. 使用了SLF4J作为日志门面
  3. 将JUL也转换成slf4j
  4. 也可以使用log4j2作为日志门面,但是最终也是通过slf4j调用logback

在使用Springboot框架之后,其内部所有的日志实现都通过桥接器转换成slf4j日志门面进行统一的管理,最终交给logback日志实现框架进行日志输出

测试Springboot底层日志实现

用代码测试下,看是否如我们所说,不管使用什么日志实现,Springboot底层最终都是通过slf4j进行统一管理,并采用logbook作为日志实现框架进行输出

1. 在当前Springboot项目下的测试方法中编写测试代码

2. slf4j 测试代码

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootLogApplicationTests {

    // 声明日志记录器对象(slf4j包)
    public static final Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
    @Test
    void contextLoads() {
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
    }

}

3. 运行结果

!! 注意:因为我们没有提供任何配置文件,因此默认的日志级别就是info

使用log4j2输出日志信息 

4. 增加log4j2的日志打印

import org.apache.logging.log4j.LogManager;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootLogApplicationTests {

    // 声明日志记录器对象(slf4j包)
    public static final Logger logger = LoggerFactory.getLogger(SpringbootLogApplicationTests.class);
    @Test
    void contextLoads() {
        // 使用slf4j输出日志
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");

        // 使用log4j2输出日志, 底层会使用桥接器切换为slf4j门面和logback日志实现
        org.apache.logging.log4j.Logger logger2 = LogManager.getLogger(SpringbootLogApplicationTests.class);
        logger2.fatal("log4j2 fatal");
        logger2.error("log4j2 error");
        logger2.warn("log4j2 warn");
        logger2.info("log4j2 info");
        logger2.debug("log4j2 debug"); 
        logger2.trace("log4j2 trace");
    }
}

5. 输出结果

说明:使用log4j2获取logger进行日志打印,但控制台输出的日志格式与slf4j 打印一致,说明springboot底层调用了log4j的桥接器,将log4j2转换成了slf4j进行统一管理,最终由logback日志实现框架进行日志输出

其实从日志输出级别也可以看出,log4j2 输出fatal的日志信息时,前面显示的级别是error

SpringBoot 日志配置文件

Springboot 支持对日志进行具体的配置,可以直接在application.properties配置文件中简单定义,也可以导入具体日志实现的配置文件

默认配置文件application.properties

Springboot默认提供的配置文件可以进行简单的配置

指定日志输出的级别、格式

# 自定义logger对象的日志级别("com.ahead" 是自定义logger对象的名称)
logging.level.com.ahead = trace

# 指定控制台输出消息格式
logging.pattern.console = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n

 输出结果 :各日志级别的信息按照指定的格式被打印出来了

指定日志信息输出到文件

# 自定义logger对象的日志级别("com.ahead" 是自定义logger对象的名称)
logging.level.com.ahead = trace

# 指定控制台输出消息格式
logging.pattern.console = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n


# 指定存放日志文件的具体路径和生成的日志文件名称(指定的目录和文件可无需存在,会自动生成)
logging.file.name = /Users/wpf011/log/springboot.log

# 指定日志文件消息格式
logging.pattern.file = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n

说明:既指定了输出到控制台的console,也指定了输出到文件file,因此控制台也会输出日志内容,指定的文件目录也会产生日志文件

指定日志文件存放目录

# 指定存放日志文件的具体路径和生成的日志文件名称(指定的目录和文件可无需存在,会自动生成)
#logging.file.name = /Users/wpf011/log/springboot.log

# 指定日志文件存放的目录,默认生成spring.log文件(指定的目录和文件可无需存在,会自动生成)
logging.file.path = /Users/wpf011/log/springboot/

# 指定日志文件消息格式
logging.pattern.file = [%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %m%n

# 注意:file.name和file.path不能同时使用,如果同时使用,默认使用file.name
# file.name 指定了日志文件的存放目录和生成的日志文件名称
# file.path 仅指定日志文件目录

 

指定配置文件

SpringBoot提供的默认配置文件无法进行复杂的配置

比如所有日志都放到一个文件当中,不易于后期维护和管理,希望是按照一定的规则进行滚动拆分,比如文件大小,时间等。通过简单的SpringBoot提供的配置文件还不够,通常在企业开发中会导入具体某个日志实现相应的配置文件

给类路径下放上每个日志框架自己的配置文件,SpringBoot就不使用默认配置的了

日志框架配置文件
Logbacklogback-spring.xml、logback.xml
Log4j2log4j2-spring.xml、log4j2.xml
JULlogging.properties

举例:指定logback配置文件

在类路径下新建logback的配置文件:logback-spring.xml 或 logback.xml

1. 配置文件内容如下

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

    <!-- 配置集中管理属性
         作用:如果其他标签要使用,可以直接通过表达式来引用:${property的name值}-->
    <!-- 1.配置日志的输出格式,name:自定义名称  value:具体格式值 -->
    <property name="pattern" value="[%-5level]  %d{yyyy-MM-dd HH:mm:ss}  %c  %M  %L  %thread  %m  %n"/>
  
    <!-- 2.配置控制台输出的appender, name:自定义appender名称  class:appender类型-->
    <appender name="myConsole" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 2.1控制输出流对象,默认System.out控制台黑色字体,修改为System.err红色字体 -->
        <target>System.err</target>
        <!-- 2.2日志消息的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>


    <!-- 3.自定义logger 对象,additivity:是否继承父元素RootLogger的属性配置-->
    <logger name="com.ahead" level="info" additivity="false">
        <appender-ref ref="myConsole" />
    </logger>
</configuration>

2. 运行测试用例,查看日志输出结果

 上传了具体日志实现的配置文件后,默认的SpringBoot配置信息就会作废

使用SpringBoot解析日志配置

在上述指定配置文件中,对于logback配置文件,logback-spring.xml 和 logback.xml 都能够被加载识别,增加了-spring 的配置文件会被SpringBoot框架解析,而不是由logback解析

被SpringBoot框架解析的文件,只需修改SpringBoot的全局参数,就能对配置文件进行灵活调整,而不需要再修改logback提供的核心配置文件了


举例说明:

在开发环境输出的消息格式是详细信息(行号、类名),在生产环境下只需输出时间和日志具体内容即可,那么我们可以如下操作

1. logback-spring.xml 默认由SpringBoot框架解析日志配置

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
     <!-- 如果是开发环境,使用默认的消息格式 -->
     <springProfile name="dev">
          <pattern>${pattern}</pattern>
     </springProfile>
     <!-- 如果是生产环境,使用简单的消息格式输出消息 -->
     <springProfile name="pro">
          <pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level]  %m%n</pattern>
     </springProfile>
</encoder>

2. application.properties 配置文件

spring.profiles.active = dev

具体操作如下

调整logback配置文件为SpringBoot 框架所解析

1. 将logback.xml 文件修改为logback-spring.xml

2. 增加<springProfile> 标签设置

说明:如果是dev开发环境,输出的消息格式是${pattern},即<property>标签中定义的值,消息详细,如果是pro开发环境,则消息格式相对简单,只输出时间、日志级别、日志内容 

3. 增加application.properties 配置文件的全局参数

4. 测试用例输出结果 

结论:通过SpringBoot默认配置文件全局参数设置,可控制针对不同环境日志输出的具体格式

SpringBoot 切换日志实现

SpringBoot框架默认使用slf4j的统一API进行日志的管理,具体实现日志框架用的是logback

在目前企业开发中,log4j2的性能已经远超于logback了,通过SpringBoot也可以使用log4j2来进行日志的实现处理。

切换为log4j2日志

  1. 排除logback:将默认启动器的logging进行排除,其内部的logback就被移除了
  2. 新增 log4j2 依赖:添加log4j2 启动器。底层日志门面也是slf4j,但日志实现换成了log4j2,底层也是使用转换器和桥接器
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 1.排除logback -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 2.增加log4j2依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

执行测试用例:我们上述配置了logback.xml文件失效了,说明底层使用的日志换成了log4j2

配置log4j2配置文件

上述指定配置文件也讲述过了,由于我们更换了log4j2,因此我们也可以设置log4j2-spring.xml、log4j2.xml 相应的配置文件

1. 在classpath目录下增加配置文件

2. 配置文件具体内容

<?xml version="1.0" encoding="UTF-8" ?>
<!-- status:日志框架本身的输出日志级别
     monitorInterval:自动加载配置文件的间隔时间,不低于5秒(生产环境修改了配置文件也无需重启服务)
 -->
<Configuration status="debug" monitorInterval="5">
  
    <!-- 日志处理 -->
    <Appenders>
        <!-- 输出到控制台的appender  该appender的名称为console  输出流类型为:SYSTEM_ERR 红色字体输出在控制台 -->
        <Console name="console" target="SYSTEM_ERR">
            <!-- 消息输出格式的表达式 -->
            <PatternLayout pattern="%d{HH:mm:ss} [%t] [%-5level] %c{36}:%L --------%m%n" />
        </Console>

    </Appenders>

    <!--logger 定义 -->
    <loggers>
        <!-- 使用RootLogger配置日志级别 -->
        <Root level="trace">
            <!-- 指定日志使用的appender处理器 -->
            <Appender-Ref ref="console" />
        </Root>
    </loggers>

</Configuration>

3.测试用例执行结果

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值