# 日志框架
**Repository Path**: bruce6213/log-framework
## Basic Information
- **Project Name**: 日志框架
- **Description**: SpringBoot 默认日志框架Slf4j + logback, 以及logback.xml配置文件的使用 demo
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-04-18
- **Last Updated**: 2025-06-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 引言
- Spring默认使用的日志框架是JCL,而**SpringBoot默认集成**的日志框架使用的是**SLF4j+Logback**组合。
- spring-boot-starter-logging是Logback的日志实现,而Spring Boot启动项spring-boot-starter又依赖了spring-boot-starter-logging,所以Spring Boot就默认集成了Logback,**无需额外添加相关依赖,开箱即用**。
- 默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格式等。复杂的场景(区分 info 和 error 的日志、每天产生一个日志文件等)满足不了,故还需要**自定义配置文件logback-spring.xml**。
```
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n
UTF-8
${LOG_HOME}/app.log
${LOG_HOME}/app-%d{yyyy-MM-dd}.%i.log
10MB
30
20GB
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n
UTF-8
```
# 框架示意图

# 更换默认实现
## 日志门面框架
通过@SLF4j注解, 我们就可以使用SLF4J的门面框架,其等同如下代码:
```
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(YourClass.class);
```
## 日志实现框架
由于spring-boot-starter包含了spring-boot-starter-logging,故如果我们需要更换日志实现框架,首先需要排查该依赖
```
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-logging
```
然后再添加相应的依赖即可,例如log4j2
```
org.springframework.boot
spring-boot-starter-log4j2
```
# 配置文件加载顺序
1. 如果有 logback-spring.xml,则只会加载它。
2. 没有 logback-spring.xml 有 logback.xml,则加载 logback.xml。
3. 如果仅有 application.properties,则使用 Spring Boot 默认日志配置,并允许通过 application.properties 控制部分日志行为。
4. 如果既有logback-spring.xml 和 application.properties,具体生效以logback-spring.xml为主。
# 日志文件路径设置
## 方式一
```
文件相对保存路径设置可分以下三种(假设当前项目目录为C:\Users\IDEA\logDemo):
1. value=“logs” – 表示保存到程序运行目录,在tomcat中为bin目录(C:\Users\IDEA\logDemo\logs)
2. value=“/logs” – 表示保存到系统目录(C:\logs)
3. value=“../logs” – 表示保存到程序运行目录的父目录(C:\Users\IDEA\logs)
```
## 方式二
```
// 动态读取application.yml
```
# 常用标签
## configuration标签
```
```
### scan属性
当此属性设置为true时,配置文件如果发生改变,将会被重新加载,**默认值为true**。
### scanPeriod属性
设置监测配置文件是否有修改的时间间隔;如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。**默认的时间间隔为1分钟**。
### debug属性
当此属性设置为true时,将打印出logback内部日志信息;**默认值为false。**
## contextName标签
- 用于设置上下文名称;每个logger都关联到logger上下文,默认上下文名称为“default”。
- **一旦设置,不能修改**,即不能在多个配置文件中重复配置。
```
logback
```
## property标签
- 用于定义变量(name:value)
- 定义变量后,可以使“${}”来使用变量
```
${APP_Name}
```
## appender标签
- 确定打印输出策略(一般来说分为控制台、文件)
- 确定日志的输出格式
### 控制台输出
```
%d{yyyy-MM-dd HH:mm:ss.SSS} # 日志时间(精确到毫秒)
[%thread] # 线程名
%highlight(%-5level) # 日志级别,高亮显示
%cyan(%logger{50}:%L) # 日志记录器名(最多50字符)和代码行号,青色显示
- %msg%n # 日志消息及换行
UTF-8 # 设置字符集为UTF-8,防止中文乱码
```
### 文件输出
```
${LOG_HOME}/log_debug.log
${LOG_HOME}/jeecgboot-%d{yyyy-MM-dd}.%i.log
30
10MB
20GB
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n
UTF-8
```
## root标签
- 用于确定启动哪些apperder
- root 只会影响没有被单独设置 level 的 logger
- root的level决定了日志输出的**全局最低门槛**
```
# 日志级别从高到底:ERROR、WARN、INFO、DEBUG、TRACE
```
## logger标签
- root相当于全局配置,而logger相当于局部配置
```
```
# 日志过滤器
```
trace
${LOG_PATTERN}
UTF-8
```
```
debug
ACCEPT
DENY
```
# 参考文章
[logback.xml配置文件介绍](https://juejin.cn/post/7200549600590282789)
[日志过滤器](https://blog.csdn.net/justry_deng/article/details/108074525)