SpringBoot日志系统

Java猫

共 3438字,需浏览 7分钟

 · 2022-01-21

日志系统

我们首先要区分一下,什么是日志门面(Facade)什么是日志实现,我们之前学习的JUL实际上就是一种日志实现,我们可以直接使用JUL为我们提供的日志框架来规范化打印日志,而日志门面,如SIf4j,是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j、 logback、java.uti.logging等,它们才实现了具体的日志系统的功能。


日志门面和日志实现就像JDBC和数据库驱动一样,一个是画大饼的,一个是真的去做饼的。


日志门面:

  • slf4j

日志实现:

  • Log4j

  • LogBack

  • Logging


下图表示slf4j如何实现各种日志框架:


注意:

每一个日志实现框架都有自己的配置文件,使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件。

比如实现框架选用logback,那么配置文件就写logback.xml这种,实现框架选log4j,那么配置就选log4j.xml这种。


slf4j日志门面

Simple Logging Facadefor Java

slf4j是门面的抽象,具体实现可以交给log4j、logback或jdk的logging来实现。


说白了就是slf4j抽象接口支持各大日志框架的实现的支持。


结构图:类似jdbc的厂商

我们用的是slf4j的门面接口,实现的是支持slf4j的实现框架(厂商)。


简单的说,就是接口和接口实现类的关系!



Logback日志实现

要使用slf4j日志就要使用支持slf4j日志的实现。

logging日志框架是log4j的后继者,相对使用较多,我们用这个来举例子。

使用slf4j日志接口实现的是logging的框架实现类。

只要有实现,slf4j就会自动去发现实现它。


然后logging实现就会自动寻找到resource资源路径下的logback.xml配置文件。


需要的jar包:

  • slf4j-api

  • logback-core

  • logback-classic


引入依赖:

   
    <dependency>
      <groupId>org.slf4jgroupId>
      <artifactId>slf4j-apiartifactId>
      <version>1.7.25version>
    dependency>

    
    <dependency>
      <groupId>ch.qos.logbackgroupId>
      <artifactId>logback-coreartifactId>
      <version>1.2.3version>
    dependency>
    
    <dependency>
      <groupId>ch.qos.logbackgroupId>
      <artifactId>logback-classicartifactId>
      <version>1.2.3version>
    dependency>

如果是SpringBoot,则不用引入依赖,本身自带了这些依赖。


logback.xml的配置文件

提示:

输出的格式是可以自由设置

指定输出的日志级别可以设置多个引用

输出日志从高到底输出

输出日志的文件如果没有会自动创建。


日志级别:

从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL, SpringBoot默认只会打印 info 以上级别的信息。


测试:(测试slf4j门面接口实现类是logging实现类框架)

测试结果:


日志的输出是按照日志的指定级别进行输出的,从小到大的级别输出。


slf4j日志的填充功能:



注意:

当slf4j在使用的时候没有导入实现的包,会报找不到实现的错。


奉上logback.xml的配置文件(方便复制

  <configuration>
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %npattern>
        encoder>

    appender>

    
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>/Users/hbm/Desktop/Java API/ok2.txtfile
        <encoder>
            <pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %npattern>
        encoder>
    appender>

    
    <root level="trace"> 
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    root>
configuration>

或者:


<configuration>
    
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}pattern>
            <charset>UTF-8charset>
        encoder>
    appender>

    
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        
        <file>log/日志文件.logfile>
        
        <append>trueappend>
        
        <encoder>
            <pattern>%date{yyyy:MM:dd:HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %npattern>
            <charset>UTF-8charset>
        encoder>
    appender>

    

    
    <root level="info">
        
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    root>
configuration>

输出日志级别level可以自己选择。


提示:

官方推荐logback的配置文件名为 logback-spring.xml 或 logback.xml 。

如果不进行logback-spring.xml的配置,则会自动使用springboot默认提供的defaults.xml预设配置,即启动时打印的信息样式配置。如果配置了logback-spring.xml,则会覆盖默认预设配置。


通过上面的学习,可以使用到控制台输出日志信息,一般建议以文件输出日志信息,方便排查bug。






SpringBoot使用日志

SpringBoot为了统一日志框架的使用,,做了这些事情:

  • 直接将其他依赖以前的日志框架剔除

  • 导入对应日志框架的SIi4j中间包

  • 导入自己官方指定的日志实现,并作为SIf4j的日志实现层


在SpringBoot中默认使用的日志门面是Slf4j日志,默认日志实现为LogBack


SpringBoot中自带了slf4j和logback的依赖,如需更换其他实现,加入依赖即可。


使用默认的slf4j+logback日志:

测试:

/**
 * 控制层
 * @Author 黄柏茗
 * @Date 2022-01-15
 */

@Controller
public class MyController {
    //日志
    Logger logger = LoggerFactory.getLogger(MyController.class);

    @RequestMapping("/test")
    public String test() {

        logger.info("打印了个小日志");

        return "测试日志";
    }
}

因为我们使用了Logbok,使用一个 @Slf4j 注解也可以搞定!

/**
 * 控制层
 * @Author 黄柏茗
 * @Date 2022-01-15
 */

@Slf4j //加入注解
@Controller
public class MyController {
    
    @RequestMapping("/test")
    public String test() {

        //可直接使用日志,更方便
        log.info("打印了个小日志");

        return "测试日志";
    }
}

两者都可以,后者更简洁方便,因为log对象本质上在编译时,lombok插件会自动给它加上Logger对象,使用的还是Logger对象。


所以,在SpringBoot中使用默认的slf4j+logback日志实现就阔以了!

使用步骤请看上面的logback日志实现。


本次实验使用的是SpringBoot+slf4j日志门面+logback日志实现。


总结:

slf4j就是个接口,需要使用接口的实现类,实现类可以自由选择,可以选择log4j或者logback或jdk自带的logging实现等.

推荐使用logback实现,因为logback是log4j的后继者。




浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报