SpringBoot使用Log4j2.md

前言

目前 JAVA 中使用最多的三大日志框架:

  • logbackSpringBoot 中的默认框架
  • log4j
  • log4j2

打印日志也面临着消耗性能,导致高并发性能下降。

优化日志一般也是从更换性能更高的日志框架做起。(对于以前的项目来讲,可以从其他日志框架切换到 log4j2,一般来讲,日志的性能会有一部分的提高。)

然后可以使用异步日志。关掉控制台日志输出等等。

log4j2 日志

配置 pom.xml

这里要注意, Springboot 原来会默认引入 logback

1
2
3
4
5
6
7
8
9
10
11
12

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--增加识别yaml格式依赖,加上这个才能辨认到log4j2.yml文件 ;spring-boot-starter 中也引入了 snakeyaml-->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
</dependencies>

去掉 Springboot 原来的日志

其它地方引入的 spring-boot-starter-logging 也要去掉。

这里推荐一个 IDEA pluginMaven Helper.
打开 pom.xml 会在左下角有一个 Dependency analyzer 页面,可以搜索目标依赖
右键点击需要操作的依赖,可以很方便的 exclude

1
2
3
4
5
6
7
8
9
10
11

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</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
Configuration:
status: INFO
Properties: # 定义全局变量
Property:
- name: log.level.console
value: info
- name: log.path #日志存储路径
value: app_log
- name: project.name #日志项目名称
value: boot
Appenders:
Console:
name: CONSOLE
target: SYSTEM_OUT
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"
RollingFile:
# 输出到文件,超过64MB归档
- 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:
# 日志大于 64MB 会生成新的日志
SizeBasedTriggeringPolicy:
size: "64 MB"
DefaultRolloverStrategy:
max: 1000
Loggers:
Root:
level: INFO
AppenderRef:
# 这里设置的 ref ,在 Logger 中不需要再次设置,Logger 继承了 Root
- ref: CONSOLE
- ref: ROLLING_FILE
Logger:
- name: boot
additivity: true
level: DEBUG
AppenderRef:
# logger 继承了 root 则这里不需要 `- ref: CONSOLE` 等 root 中已经存在的 `AppenderRef` 否则会造成重复打印

重复打印日志的原因

简单的问题

重复打印日志

Logger 继承了 Root,所以Root中的 AppenderRef 配置,都会被 Logger 继承过去。

如果不想 Logger 继承了 Root,只需要添加 additivity属性为 falseadditivity默认是为 true 的。

修改颜色

这里提供一个华丽胡哨的颜色,配置在 SYSTEM_OUT 中。

1
pattern: "%clr{%d{yyyy-MM-dd HH:mm:ss,SSS}}{faint}:%clr{%-5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%-32t]}{faint} %clr{%-40.40c{1.} (%F:%L)}{cyan} %clr{:}{faint} %m%n%xwEx"

过滤器

1
2
3
4
5
6
7
8
9
10
RollingFile: # 输出到文件,超过256MB归档
- name: ROLLING_FILE
ignoreExceptions: false
fileName: ${log.path}/${project.name}.log
thresholdFilter:
level: INFO
# 高于 info 拦截
onMatch: ACCEPT
# 低于 info 拦截
onMismatch: DENY

是按严重(重要)程度来分的(如下6种):
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

1
2
3
4
5
6
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的

Appender类型

Appender 描述
ConsoleAppender 主要用于将日志打印到控制台
FailoverAppender 配置多个Appender,当primary Appender挂了的时候可以切换到Standby Appender
FileAppender 将日志写入文件
JDBCAppender 将日志写入到数据库
JMS Appender 将日志写入消息broker
HttpAppender 将日志写入http服务端
KafkaAppender 将日志写入kafka服务端
NoSQLAppender 将日志写入NoSQL服务端
MongoDB 将日志写入MongoDB
RollingFileAppender 将日志写入回滚文件
SocketAppender 将日志写入socket服务器

本文地址: https://github.com/maxzhao-it/blog/post/26399/