log4j2
quick start
引入依赖(并排除spring-boot-starter-logging
依赖
1 |
|
1 |
|
- 引入Logger
Logger logger = LoggerFactory.getLogger(getClass());
@Slf4j
lombok的注解,相当于Logger log = LoggerFactory.getLogger(getClass());
- log.日志级别(内容)
- 包括
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
- 包括
- 内容,可以用
{}
作为占位符。
配置文件: log4j2.xml
Log4j2.xml
的配置
1 |
|
SpringBoot缺省的Log4j2.xml
配置如上。(添加了一个Logger标签,方便说明)
可以看到根节点Configuration下有两个标签Appenders和Loggers
Loggers是日志收集器,负责从服务中收集日志信息,Appenders是日志附加器,负责将收集来的日志信息输出到对应终端。
从日志生产的顺序来看
1 首先需要获取一个logger对象,有三种方式
- LoggerFactory.getLogger(String),logger的名称为入参的字符串
- LoggerFactory.getLogger(Clazz),logger的名称为入参.getName()
- @Slf4j注解,logger的名称默认为该类的全类名(getName),可以用topic属性指定
结合图中三种方式,实际上产生了三个logger类型对象(黄色方框)
2 log4j2.xml中Logger配置
Loggers标签下有两种子标签,logger和root
logger就是对上述logger类型对象的配置。
1 |
|
可以看到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 |
|
这里有三种类型的附加器:
- 终端, terminal 就是这个来指定格式
- XMDFile 本地日志
- 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会根据自己的逻辑做各自的处理,将日志输出到对应的终端。