SpringBoot——日志(五)

springboot的日志框架

Spring Boot 默认选择了 SLF4J 结合 LogBack。

在 Spring Boot 的 Maven 依赖里可以清楚的看到 Spring Boot 排除了其他日志框架。

其实 Spring Boot 也是使用了 SLF4J+logback 的日志框架组合,查看 Spring Boot 项目的 Maven 依赖关系可以看到 Spring Boot 的核心启动器 spring-boot-starter 引入了 spring-boot-starter-logging.

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.1.1.RELEASE</version>
<scope>compile</scope>
</dependency>

而 spring-boot-starter-logging 的 Maven 依赖主要引入了 logback-classic ,log4j-to-slf4j ,jul-to-slf4j .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.11.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
</dependencies>

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootTest
@RunWith(SpringRunner.class)
public class LogbackTest {

Logger logger = LoggerFactory.getLogger(getClass());

@Test
public void testLog() {
logger.trace("Trace 日志...");
logger.debug("Debug 日志...");
logger.info("Info 日志...");
logger.warn("Warn 日志...");
logger.error("Error 日志...");
}
}

已知日志级别从小到大为 trace < debug < info < warn < error . 运行得到输出如下。由此可见 Spring Boot 默认日志级别为 INFO.

1
2
3
2020-05-14 13:28:11.340  INFO 7180 --- [           main] com.qn.test.LogbackTest                  : Info 日志...
2020-05-14 13:28:11.340 WARN 7180 --- [ main] com.qn.test.LogbackTest : Warn 日志...
2020-05-14 13:28:11.340 ERROR 7180 --- [ main] com.qn.test.LogbackTest : Error 日志...

结合日志来看,默认的日志格式为:

1
2
3
4
5
6
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# %d{yyyy-MM-dd HH:mm:ss.SSS} 时间
# %thread 线程名称
# %-5level 日志级别从左显示5个字符宽度
# %logger{50} 类名
# %msg%n 日志信息加换行

自定义日志输出

properties:

1
2
3
4
5
6
logging.file.path=log 
logging.file.max-history=10
logging.file.max-size=10MB
logging.level.com.qn=debug
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

yml:

1
2
3
4
5
6
7
8
9
10
11
logging:
file:
path: log
max-history: 10
max-size: 10MB
level:
com:
qn : debug
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n'
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n'

使用配置文件

1
2
logging:
config: classpath:logging-config.xml

log4j

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependency> <!-- exclude掉spring-boot的默认log配置 -->  
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency> <!-- 加上这个才能辨认到log4j2.yml文件 -->
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

log4j2.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Configuration:  
status: warn

Properties: # 定义全局变量
Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
#测试:-Dlog.level.console=warn -Dlog.level.xjj=trace
#生产:-Dlog.level.console=warn -Dlog.level.xjj=info
- name: log.level.console
value: trace
- name: log.level.xjj
value: trace
- name: log.path
value: /opt/logs
- name: project.name
value: my-spring-boot

Appenders:
Console: #输出到控制台
name: CONSOLE
target: SYSTEM_OUT
ThresholdFilter:
level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
onMatch: ACCEPT
onMismatch: DENY
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"
RollingFile: # 输出到文件,超过128MB归档
- name: ROLLING_FILE
ignoreExceptions: false
fileName: ${log.path}/${project.name}.log
filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"
Policies:
SizeBasedTriggeringPolicy:
size: "128 MB"
DefaultRolloverStrategy:
max: 1000

Loggers:
Root:
level: info
AppenderRef:
- ref: CONSOLE
- ref: ROLLING_FILE
Logger: # 为com.xjj包配置特殊的Log级别,方便调试
- name: com.xjj
additivity: false
level: ${sys:log.level.xjj}
AppenderRef:
- ref: CONSOLE
- ref: ROLLING_FILE

logback的优势

  1. 更快的执行速度:logback重写了内部实现,在某些特定的场景下,甚至比之前快了10倍。在保证logback组件更快速的同时所需内存更小。
  2. 与SLF4J组合使用。
  3. 自动刷新配置文件:这个过程很快,无需资源竞争,不会创建一个单独的线程去扫描。
  4. 优雅的从I/O错误中恢复,文件服务器宕机,无需重新启动。
  5. 过滤:可以设置特定用户日志级别。
  6. logback原生支持同时按日期和文件大小分割。
文章目录
  1. 1. springboot的日志框架
  2. 2. demo
  3. 3. 自定义日志输出
  4. 4. 使用配置文件
  5. 5. log4j
  6. 6. logback的优势
|