我们首先介绍一下开源日志框架。
首先是commons-logging,是apache最早提供的日志框架。它的主要作用提供一个统一的日志接口,以便可以在不同的项目中使用不同的日志框架。common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志实现库(例如,jdk自带的logging库)。
接下来是slf4j,它与commons-logging非常的相似,也是对不同日志框架提供一个统一的日志接口,可以在部署的时候不修改任何配置即可接入一种日志实现库。slf4j与具体的日志实现框架,如log4j、logback等。
备注:commons-logging和slf4j是java中的日志接口,具体的实现可以由开发人员自由选择。log4j和logback则是具体的日志实现方案。
log4j是经典的一种日志解决方案,它允许开发者通过配置文件灵活地控制日志的输出目标、记录级别、输出格式等。logback也是一种日志实现,它是log4j的创始人开发的一个新的日志框架。它实现了slf4j的接口,因此可以作为slf4j的一个具体实现。
最后介绍一下log4j2,它是 log4j 和 logback 的改进版。在 Log4j2 中,分为 API(log4j-api)和实现 (log4j-core) 两个模块。在性能方面,log4j2采用的异步日志记录机制,能够在不阻塞主线程的情况下进行日志记录,从而大大提高了日志处理的效率。
默认情况下,Spring Boot 默认使用 slf4j + logback 进行日志记录,并将INFO级别输出到控制台,但不会写到日志文件。接下来,我们创建一个 “SpringBootLogbackDemo” 工程。
然后我们修改编码格式以及Maven仓库地址,我们省略这个过程了。
接下来,我们修改 “pom.xml” 文件,添加SpringBoot和Web依赖,如下所示
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>SpringBootLogbackDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
</plugin>
</plugins>
</build>
</project>
接下来,我们创建 Appliaction 入口类文件
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
接下来,我们就可以启动测试一下,直接查看控制台的日志
我们随便查看一条日志信息
2024-10-31 11:19:31.313 INFO 6480 --- [main] com.demo.Application: Started Application in 7.246 seconds (JVM running for 9.088)
日志输出内容元素具体如下:
时间日期: 2024-10-31 11:19:31.313
日志级别: INFO
进程ID: 6480
分隔符: ---
线程名: main
Logger名: com.demo.Application (类名)
日志内容: Started Application in 7.246 seconds (JVM running for 9.088)
这里说明一下日志级别,日志级别从低到高分为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
trace:追踪日志,输出程序执行的轨迹,一般不使用。
debug:调试日志,调试情况下使用。
info: 信息日志,默认输出级别。
warn: 警告日志,潜在的错误信息,用于提示开发人员是否需要处理。
error:错误日志,无法正常完成目标操作,需要开发人员处理。
fatal:致命错误日志,可能会导致应用程序的退出,需要开发人员处理。
在开发环境中,我们使用最多的是“info”和“debug”日志信息,在测试和生产环境中,我们则使用 “warn” 和 “error” 日志信息。如果有些问题无法在开发环境中解决的话,可以在测试和生产环境中使用“info”日志辅助我们寻找问题。接下来,我们创建一个 TestController 控制器来使用 logback 记录日志
package com.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Map;
@Controller
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@GetMapping("/test")
public String test(Map map){
log.info("记录一下日志");
map.put("message", "hello, world!");
return "test";
}
}
接下来,我们创建 “resources\static\index.html” 入口文件
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>index</title>
</head>
<body>
<a href="/test">/test</a>
</body>
</html>
接着,我们继续需要创建 “resources\templates\test.html” 文件
<!doctype html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>test</title>
</head>
<body>
<p th:text="${message}"></p>
</body>
</html>
接下来,我们重启测试一下
接下来,我们查看一下控制台
默认情况下,Spring Boot 的 root 日志级别设置为 INFO。你可以在 src/main/resources/application.properties 中为 root 或任何指定的包配置日志级别,如下所示:
logging.level.root=WARN
logging.level.com.demo=WARN
上面的配置中,我们还定义了 com.demo 包下日志以 WARN 级别输出。
由于 WARN 级别高于 INFO 级别,除了Spring的Info日志,我们之前的日志也就不会输出了。
如果想要将日志输出到文件中,可通过如下两个配置:
logging.level.root=INFO
logging.level.com.demo=INFO
logging.file.name = E:/idea-workspace/SpringBootLogbackDemo/test.log
我们将日志文件存储到当前工程根目录下,并且修改了日志级别为INFO级别,以便有信息存储到文件中。
使用 logging.* 方式不能对日志做出更加详细的配置,我们可以创建专门的日志配置文件,也就是 src/main/resources/logback.xml 文件。不过,Spring Boot 提供了一些 logback 扩展,可帮助你使用高级配置选项。为了使用这些扩展,需要创建名为 logback-spring.xml 而非 logback.xml 的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义日志文件名称 -->
<property name="log.name" value="Demo" />
<!-- 定义日志输出路径 -->
<property name="log.path" value="E:/idea-workspace/SpringBootLogbackDemo" />
<!-- 定义日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 定义控制台输出策略 Console -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 直接使用我们上面定义的“日志输出格式” -->
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 定义文件输出策略 RollingFile -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件保存路径和名称 -->
<file>${log.path}/${log.name}.log</file>
<!-- 直接使用我们上面定义的“日志输出格式” -->
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 定义文件滚动策略:按照时间和大小进行滚动 -->
<!-- 随着应用程序运行时间越来越长,日志也会增长的越来越大,我们需要切分日志文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按照日期和切分重新定义日志文件 -->
<fileNamePattern>${log.path}/${log.name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件的大小 -->
<maxFileSize>10MB</maxFileSize>
<!-- 控制日志文件总大小 -->
<totalSizeCap>10GB</totalSizeCap>
<!-- 只保留最近90天的日志 -->
<maxHistory>90</maxHistory>
</rollingPolicy>
</appender>
<!-- SpringBoot的Root日志级别为INFO级别 -->
<root level="info">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<!-- 定义"com.demo"包下日志级别为INFO级别 -->
<logger name="com.demo" level="info" additivity="false">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</logger>
</configuration>
上面的配置中已经给出了很多注释,就不再详细介绍了,我们主要介绍一下日志格式
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} --- [%method,%line] --- %msg%n
%d{yyyy-MM-dd HH:mm:ss.SSS}:日期和时间的格式化模式。
[%thread]:表示当前线程的名称。
%-5level:表示日志级别,-5表示日志级别的最小宽度为5个字符,如果日志级别不足5个字符,则左对齐并用空格填充。
%logger{50}:表示日志记录器的名称(类名)。{36}:表示日志记录器名称的最大长度为36个字符,如果名称超过36个字符,则截断。
[%method,%line]:表示方法名和行号。
%msg:表示日志消息的内容。
%n:表示换行符,用于在每条日志消息后换行。
最后我们注释掉 “application.properties” 中的配置信息
#logging.level.root=INFO
#logging.level.com.demo=INFO
#logging.file.name = E:/idea-workspace/SpringBootLogbackDemo/test.log
我们重新运行测试一下
对于日志文件的切分,我们可以将其配置调整小一些,进行测试。
<!-- 单个日志文件的大小 -->
<maxFileSize>2KB</maxFileSize>
如何将SQL语句输入到控制台和文件中,配置文件 “application.properties” 修改如下
# 打印SQL到控制台和文件日志中
logging.level.com.demo.mapper = DEBUG
logging.level.com.baomidou.mybatisplus = DEBUG
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.configuration.log-impl = org.apache.ibatis.logging.slf4j.Slf4jImpl
#mybatis-plus.configuration.log-impl = org.apache.ibatis.logging.stdout.StdOutImpl
备注:包路径com.demo.mapper是我们自己创建的Mapper接口路径。
本工程完整代码下载: https://download.csdn.net/download/richieandndsc/89953263
标签:INFO,SpringBoot,logging,log,org,日志,com,21 From: https://blog.csdn.net/richieandndsc/article/details/143558025