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

目录

日志

项目总结

新建一个SpringBoot项目

 pom.xml

application.properties项目配置文件

logger.xml日志配置文件

TestController控制器

SpringbootSlf4jApplication启动类

启动项目

生成logger.log日志文件


日志

  • 在开发中,我们经常使用 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

logger.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案例!
  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,需要在 pom.xml 中添加 slf4j 相关的依赖: ```xml <dependencies> <!-- SpringBoot Web 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- slf4j 相关依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.26</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies> ``` 其中,slf4j-api 是 slf4j 的接口,logback-classic 是 slf4j 的实现。 接下来,需要在 src/main/resources 目录下添加 logback.xml 配置文件: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!-- 控制台输出日志格式 --> <encoder> <pattern>%-5level %d{HH:mm:ss.SSS} [%thread] %logger{50} - %msg%n</pattern> </encoder> </appender> <appender name="file" class="ch.qos.logback.core.FileAppender"> <!-- 日志文件路径 --> <file>logs/myapp.log</file> <encoder> <!-- 日志文件输出日志格式 --> <pattern>%-5level %d{HH:mm:ss.SSS} [%thread] %logger{50} - %msg%n</pattern> </encoder> </appender> <root level="info"> <!-- 控制台输出日志级别 --> <appender-ref ref="console" /> <!-- 日志文件输出日志级别 --> <appender-ref ref="file" /> </root> </configuration> ``` 其中,控制台输出和日志文件输出的格式可以根据自己的需要进行调整。 最后,在代码中使用 slf4j 来输出日志: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { private Logger logger = LoggerFactory.getLogger(HelloController.class); @GetMapping("/hello") public String hello() { logger.info("Hello, World!"); return "Hello, World!"; } } ``` 这里使用了 LoggerFactory 类来获取 Logger 对象,然后使用 Logger 对象输出日志。在上面的例子中,输出的日志级别是 info,所以只有 info 及以上级别的日志会被输出到控制台和日志文件中。如果需要输出 debug 或者其他级别的日志,可以在 logback.xml 中进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戏拈秃笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值