log4j2

quick start

引入依赖(并排除spring-boot-starter-logging依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
@Slf4j
public class BookServiceImpl implements BookService {
//Logger logger = LoggerFactory.getLogger(getClass());

@Autowired
BookRepository repository;

@Override
public List<BookPO> selectAll(String id) {
log.info("BookService.selectAll, request={}", id);
return repository.selectAll();
}
}
  1. 引入Logger
    1. Logger logger = LoggerFactory.getLogger(getClass());
    2. @Slf4jlombok的注解,相当于Logger log = LoggerFactory.getLogger(getClass());
  2. log.日志级别(内容)
    1. 包括TRACE < DEBUG < INFO < WARN < ERROR < FATAL
  3. 内容,可以用{}作为占位符。

配置文件: log4j2.xml

Log4j2.xml的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="LoggerA" level="INFO" addidity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

SpringBoot缺省的Log4j2.xml配置如上。(添加了一个Logger标签,方便说明)

可以看到根节点Configuration下有两个标签Appenders和Loggers

Loggers是日志收集器,负责从服务中收集日志信息,Appenders是日志附加器,负责将收集来的日志信息输出到对应终端。

image-20230426030614879

从日志生产的顺序来看

1 首先需要获取一个logger对象,有三种方式

  1. LoggerFactory.getLogger(String),logger的名称为入参的字符串
  2. LoggerFactory.getLogger(Clazz),logger的名称为入参.getName()
  3. @Slf4j注解,logger的名称默认为该类的全类名(getName),可以用topic属性指定

结合图中三种方式,实际上产生了三个logger类型对象(黄色方框)

2 log4j2.xml中Logger配置

Loggers标签下有两种子标签,logger和root

logger就是对上述logger类型对象的配置。

1
2
3
<logger name="LoggerA" level="info" additivity="false">
<AppenderRef ref=""/>
</logger>

可以看到logger标签有三个属性和一个子标签

​ name指定了这个配置对谁生效,要和上面的log对象名称相对应

​ level指定了关注的最低级别

​ additivity 指定了是否经过root

​ 子标签指定了关联的附加器

root是logger标签的一种特殊情况,是根日志记录器,对两种logger对象生效

1. 没有<logger>标签对应的对象
1. 有<logger>标签对应,但是additivity="true"的对象

3 log4j2.xml Appenders标签配置

Appenders标签下的appender根据不同输出终端,会有不同的标签类型

共同点是都有name, 与AppenderRef中ref字段通过name关联

1
2
3
4
5
6
7
8
9
10
11
12
13
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>

<XMDFile name="infoAppender" fileName="info.log" sizeBasedTriggeringSize="512M" rolloverMax="30">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</XMDFile>

//dianping.Cat
<CatAppender name="catAppender"/>

这里有三种类型的附加器:

  1. 终端, terminal 就是这个来指定格式
  2. XMDFile 本地日志
  3. CatAppender 服务监控平台,异常的打点上报

这里展开说明一下XMDFile标签里的Filters标签。

onMatch: >= level的

onMisMatch: < level的

DENY: 拒绝

NEUTRAL: 不做处理,往下漏

ACCEPT: 接受

以infoAppender的filters为例,

先经过<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>

​ >= warn的直接拒绝

​ < warn的漏到下一个filter处理

再经过<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

​ >= info的接受

​ < info的拒绝

所以最后被接受的level符合:info <= level < warn,即只接受了info类型的日志。

4 输出到日志终端

Appender会根据自己的逻辑做各自的处理,将日志输出到对应的终端。


log4j2
https://yzaf.top/2023/developTool/log4j2/
作者
why
发布于
2023年4月25日
许可协议