0


SpringBoot——整合SLF4j进行日志记录

日志

  • 在开发中,我们经常使用 System.out.println() 来打印一些信息,但是这样大量地使用System.out 会增加资源的消耗。所以在实际项目中使用 SLF4j 的 logback 来输出日志,效率更高
  • Spring框架日志管理默认选择的是JCL
  • Spring Boot默认使用的日志抽象层是 SLF4j ,默认使用的日志实现层是 logback

常用日志框架:
常用的日志框架简要介绍JUL(java.util.logging.Logger)

  • 系统自带

  • 功能不够强大
    Apache Commons Logging

  • 由Apache提供的一个通用日志API

  • 在程序运行时,通过动态机制自动找到真正使用的日志库
    Log4j

  • 主要组成部分: - Logger(日志记录器):控制日志的输出级别与是否输出日志- Appender(输出端):指定日志的输出地点- Layout(日志格式化器):控制日志信息的输出格式

  • 7种log级别:(从低到高)TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

  • 支持两种格式的配置文件:properties和XML
    Logback

  • 是Log4j的升级版

  • 分成3个模块: - logback-core- logback-classic- logback-access
    Log4j2

  • 是Log4j和Logback的升级版

SLF4J

(Simple Loggin Facade for Java,简单日志门面)

  • 是对所有日志框架制定的一种规范、标准和接口,不是具体的框架
  • 需要和诸如上面的具体框架配合使用
  • 多为SLF4J+Logback或SLF4J+Log4j2组合使用

日志级别:(输出当前级别以及更高级别的日志信息)
日志级别描述OFF关闭:不输出日志FATAL致命:输出可能会导致应用程序终止(崩溃)的错误ERROR错误:输出程序的错误(不会导致程序崩溃的错误)WARN警告:提示可能出现的问题INFO****信息:输出应用运行过程的详细信息DEBUG调试:输出对调试有用的信息TRACE跟踪:输出程序的运行轨迹ALL所有:输出所有级别的信息
日志格式变量:
日志格式变量描述%level输出日志的级别%date 或 %d日志发生的时间%logger
输出Logger的类路径,包名+类名

{n}限定了输出长度
%thread当前线程名%M日志发生时的方法名%L
日志调用代码所在行

(可能对性能有消耗)
%m日志消息%n
换行

项目总结

  1. 通常情况下,Spring Boot会默认使用Logback作为日志实现,并已经将相应的依赖包含在内
  2. 配置日志:创建一个logback.xml文件(或者logback-spring.xml,用于Spring Boot项目),在这个文件中配置日志输出格式、日志级别、日志文件路径等信息。
  3. 使用SLF4J接口:在你的代码中,使用SLF4J提供的Logger接口来记录日志。通过调用不同级别的log方法,你可以记录不同级别的日志信息。
  4. 运行应用程序:当你启动你的Spring Boot应用程序时,SLF4J会将日志信息传递给你配置的日志框架(比如Logback),然后根据你的配置输出日志到指定的地方,比如控制台或日志文件。

新建一个SpringBoot项目

项目结构:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.study</groupId>
    <artifactId>springboot_slf4j</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_slf4j</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties项目配置文件

# 使用logback.xml来配置日志
logging.config=classpath:logback.xml

logback.xml日志配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
    <property name="FILE_PATH" value="F:/JavaProject2024_4_17/springboot_slf4j/logger.log"/>

    <!--定义控制台按照上面配置的LOG_PATTERN来打印日志-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--按照上面配置的FILE_PATH路径来保存日志-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${FILE_PATH}</file> <!-- 修改为file节点来指定日志文件路径 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_PATH}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日志保存15天-->
            <maxHistory>15</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--单个日志文件超过10M,则新建日志文件存储-->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!--按照上面配置的LOG_PATTERN格式来打印日志-->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--定义日志输出级别,并引入上面的Appender,使其生效-->
    <logger name="com.study.springboot_slf4j.controller" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

TestController控制器

  • Logger接口是SLF4J(Simple Logging Facade for Java)日志门面(Facade)提供的一个接口,它允许开发人员在应用程序中记录日志。
  • SLF4J是一个为Java平台设计的简单日志门面,可以与不同的日志实现(如Logback、Log4j、java.util.logging等)结合使用。
  • Logger接口提供了各种用于记录不同级别日志的方法,包括debug、info、warn、error等。通过使用这些方法,开发人员可以在代码中插入日志语句来记录应用程序在运行时的状态、调试信息、错误信息等,以便在需要时进行排查和分析。
  • 通常情况下,开发人员会在类中创建一个静态的Logger实例,并使用LoggerFactory工厂类来获取Logger实例
  • 通过使用Logger接口,开发人员可以将日志信息传递给SLF4J,并由SLF4J将其转发到相应的日志框架进行处理和输出。这样做的好处是,开发人员可以在不同的日志框架之间切换而无需修改应用程序中的日志记录代码。
package com.study.springboot_slf4j.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    private final static Logger logger= LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/log")
    public String testLog(){
        logger.debug("===========测试日志debug级别打印===========");
        logger.info("===========测试日志info级别打印===========");
        logger.error("===========测试日志error级别打印===========");
        logger.warn("===========测试日志warn级别打印===========");

        //可使用占位符打印出一些参数信息
        String str1="Spring Boot";
        String str2="SLF4j";
        logger.info("当前案例使用的是{}整合{}案例!",str1,str2);
        return "日志记录成功";

    }
}

SpringbootSlf4jApplication启动类

package com.study.springboot_slf4j;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootSlf4jApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootSlf4jApplication.class, args);
    }
}

启动项目

1、访问网址:http://localhost:8080/test/log

2、控制台输出:

3、项目生成logger日志文件

生成logger.log日志文件

<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>j

日志根据logger.xml配置文件里定义的打印格式进行输出

2024-05-27 17:36:06.183 [main] INFO  c.s.s.SpringbootSlf4jApplication - Starting SpringbootSlf4jApplication on Administrator with PID 9496 (F:\JavaProject2024_4_17\springboot_slf4j\target\classes started by Administrator in F:\JavaProject2024_4_17\springboot_slf4j)
2024-05-27 17:36:06.198 [main] INFO  c.s.s.SpringbootSlf4jApplication - No active profile set, falling back to default profiles: default
2024-05-27 17:36:06.948 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
2024-05-27 17:36:06.948 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
2024-05-27 17:36:06.948 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
2024-05-27 17:36:06.948 [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.46]
2024-05-27 17:36:06.948 [main] INFO  o.a.c.core.AprLifecycleListener - An older version [1.2.16] of the Apache Tomcat Native library is installed, while Tomcat recommends a minimum version of [1.2.23]
2024-05-27 17:36:06.948 [main] INFO  o.a.c.core.AprLifecycleListener - Loaded Apache Tomcat Native library [1.2.16] using APR version [1.6.3].
2024-05-27 17:36:06.964 [main] INFO  o.a.c.core.AprLifecycleListener - APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2024-05-27 17:36:06.964 [main] INFO  o.a.c.core.AprLifecycleListener - APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
2024-05-27 17:36:07.980 [main] INFO  o.a.c.core.AprLifecycleListener - OpenSSL successfully initialized [OpenSSL 1.0.2m  2 Nov 2017]
2024-05-27 17:36:08.058 [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2024-05-27 17:36:08.058 [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1813 ms
2024-05-27 17:36:08.183 [main] INFO  o.s.s.c.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2024-05-27 17:36:08.292 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
2024-05-27 17:36:08.308 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
2024-05-27 17:36:08.323 [main] INFO  c.s.s.SpringbootSlf4jApplication - Started SpringbootSlf4jApplication in 2.422 seconds (JVM running for 3.554)
2024-05-27 17:36:20.759 [http-nio-8080-exec-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-05-27 17:36:20.759 [http-nio-8080-exec-1] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2024-05-27 17:36:20.762 [http-nio-8080-exec-1] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 3 ms
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] INFO  c.s.s.controller.TestController - ===========测试日志info级别打印===========
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] ERROR c.s.s.controller.TestController - ===========测试日志error级别打印===========
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] WARN  c.s.s.controller.TestController - ===========测试日志warn级别打印===========
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] INFO  c.s.s.controller.TestController - 当前案例使用的是Spring Boot整合SLF4j案例!

本文转载自: https://blog.csdn.net/weixin_72052233/article/details/139240367
版权归原作者 戏拈秃笔 所有, 如有侵权,请联系我们删除。

“SpringBoot——整合SLF4j进行日志记录”的评论:

还没有评论