Log4j2介绍
ApacheLog4j2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:
异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
性能提升,log4j2相较于log4j和logback都具有很明显的性能提升,后面会有官方测试的数据。
自动重载配置,参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。
Log4j2其实也是日志门面,而且也提供了性能优越的日志实现,但因为目前市面上SLF4J
已经成为了市面的主流门面,所以大家一般还是将Log4j2作为日志实现来用。
官网:https://logging.apache.org/log4j/2.x/
代码使用
@Test
public void normalTest() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
// 使用占位符来进行日志输出
logger.warn("{}今年{}岁了", "小明", 15);
// slf4j也支持我们将异常作为参数传入
logger.error("出现异常:", new NullPointerException());
}
@SLF4J注解的应用
我们会发现,我们在每个需要打印日志的类中,都需要传入当前类来获取Logger对象,这样显得代码十分的繁琐。我们可以引入Lombok
依赖来简化我们的代码。Lombok
提供了@Slf4j
注解来省略获取Logger对象的代码。
使用@Slf4j
注解之后,直接用log对象就行
@Slf4j
public class Slf4jTest {
@Test
public void normalTest() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
// 使用占位符来进行日志输出
logger.warn("{}今年{}岁了", "小明", 15);
// slf4j也支持我们将异常作为参数传入
logger.error("出现异常:", new NullPointerException());
}
}
log4j2配置文件
<Configuration status="info"
monitorInterval="30">
<Appenders>
<RollingFile name="fileDefaultLog" fileName="logs/dailyLog.log" filePattern="logs/dailyLog.log.%i">
<PatternLayout pattern="%d %-5p - %X{requestId} - {%c{2}} - %m%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="25MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<RollingFile name="filePerfLog" fileName="logs/dailyLog_perf.log" filePattern="logs/dailyLog_perf.log.%i">
<PatternLayout pattern="%d %c [%X{requestId}] %m%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="25MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p - %X{requestId} - {%c{1}} - %X{indent}%m%n"/>
</Console>
</Appenders>
<Loggers>
<!-- Performance, Step and Request logger -->
<Logger name="perf" level="warn" additivity="false">
<AppenderRef ref="filePerfLog"/>
</Logger>
...
<!-- root logger -->
<Root level="info">
<AppenderRef ref="fileDefaultLog"/>
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
最外层的Configuration标签,标签内可以有多个Appenders
和Loggers
子节点
error属性表示log4j默认的打印级别(会被Logger的级别覆盖)
monitorInterval属性表示log4j自动重新配置的监测间隔时间,单位是s,最小是5s。(是的,log4j2可以不用重启应用,动态读取日志配置文件!)
Appenders标签是Configuration
标签的子标签,我们可以在里面配置多个输出源,常见的有三种子节点:Console、RollingFile、File。
Console
节点用来定义输出到控制台的Appender.
name:指定Appender的名字.
target:
SYSTEM_OUT
或SYSTEM_ERR
,一般只设置默认:SYSTEM_OUT
.PatternLayout:输出格式,不设置默认为:%m%n.
File
节点用来定义输出到指定位置的文件的Appender.
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
PatternLayout:输出格式,不设置默认为:%m%n.
RollingFile
节点用来定义超过指定大小自动删除旧的创建新的的Appender.
filePattern:指定新建日志文件的名称格式.
Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略。(interval属性用来指定多久滚动一次)
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略。(size属性用来定义每个日志文件的大小)
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的。(max属性指定数量)
Loggers标签也是Configuration
标签的子标签,常见的有两种:Root和Logger。
Root
节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
Logger
节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
在文件中定义了两个Appender数据源,并把它们分配给了根Logger,也就是说以后所有级别在INFO以上日志都会在控制台和日志文本中进行输出,同时我们还单独配置了name=perf
的Logger并为其指定了Appender
的数据源,所以所有包前缀(严格来说应该是逻辑包前缀)为pref
下的类都会将日志滚动输出到dailyLog_perf.log文件中。由于该Logger默认继承了父Logger(Logger具有继承性),为了避免出现重复的日志输出,所以我们使用additivity="false"
来让这个Logger只在自定义的Appender中进行输出。