log4j2的官网地址:https://logging.apache.org/log4j/2.x/
log4j2的性能比log4j更好,具体优点很多,高并发下性能更好啊,不会发生死锁的情况。
SpringBoot使用log4j2需添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
该依赖已经添加了slf4j的依赖,其实就是slf4j作为借口,log4j2作为其实现类。所以在项目的其他依赖中需要去除其他日志的实现类。
查看项目的依赖树,可使用命令:
mvn dependency:tree
还需要在classpath下添加log4j2.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- Configuration的属性status设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!-- Configuration的属性strict设置语法的严格性 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数, 最少是5秒-->
<Configuration status="WARN" strict="true">
<!--全局属性 -->
<Properties>
<Property name="local.logging.path">E:/logs</Property>
<Property name="logging.file.path">${local.logging.path}/${project.name}</Property>
<Property name="action.file.path">${logging.file.path}</Property>
<Property name="project.name">example-learning</Property>
<Property name="logging.file.name">${sys:logging.file.path}/${project.name}.log</Property>
<Property name="logging.file.riderAccount.name">${sys:logging.file.path}/riderAccount/riderAccount.log</Property>
<Property name="logging.file.warn.name">${sys:logging.file.path}/${project.name}-warn.log</Property>
<Property name="logging.file.error.name">${sys:logging.file.path}/${project.name}-error.log</Property>
<Property name="logging.file.action.name">${sys:action.file.path}/${project.name}-action.log</Property>
<Property name="logging.file.monitor.name">${sys:logging.file.path}/monitor.log</Property>
<Property name="layout">%d %p [%t] %c{13}:%M:%L %m%n</Property>
</Properties>
<!-- https://logging.apache.org/log4j/2.x/manual/appenders.html -->
<!-- 定义日志输出目的地,以及方式,以及日志输出格式 -->
<Appenders>
<!-- 定义输出到控制台的Appender-->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${layout}" />
</Console>
<RollingRandomAccessFile name="RollingRandomAccessFile"
immediateFlush="true" fileName="${logging.file.name}"
filePattern="${logging.file.name}-%d{yyyy-MM-dd-HH}">
<PatternLayout pattern="${layout}" />
<ThresholdFilter level="debug" />
<TimeBasedTriggeringPolicy />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="RollingRandomAccessFileWarn"
immediateFlush="true" fileName="${logging.file.warn.name}"
filePattern="${logging.file.warn.name}-%d{yyyy-MM-dd}">
<PatternLayout pattern="${layout}" />
<ThresholdFilter level="warn" />
<TimeBasedTriggeringPolicy />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="RollingRandomAccessFileError"
immediateFlush="true" fileName="${logging.file.error.name}"
filePattern="${logging.file.error.name}-%d{yyyy-MM-dd}">
<PatternLayout pattern="${layout}" />
<ThresholdFilter level="error" />
<TimeBasedTriggeringPolicy />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="actionLogFile"
immediateFlush="true" fileName="${logging.file.action.name}"
filePattern="${logging.file.action.name}.%d{yyyy-MM-dd}">
<PatternLayout pattern="%m%n" />
<ThresholdFilter level="debug" />
<TimeBasedTriggeringPolicy />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="monitorLogFile"
immediateFlush="true" fileName="${logging.file.monitor.name}"
filePattern="${logging.file.monitor.name}.%d{yyyy-MM-dd}">
<PatternLayout pattern="%m%n" />
<ThresholdFilter level="info" />
<TimeBasedTriggeringPolicy />
</RollingRandomAccessFile>
</Appenders>
<!-- Root和Logger两个节点;
Root节点表示项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
LoggerLogger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等 -->
<Loggers>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等;
level: 属性level,日志输出级别;
name: 属性name,用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点;
additivity: 属性additivity,默认为true。
appender-ref: Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root,
如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出;
此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。-->
<Logger name="com.example.monitor.client.MonitorUtilImpl" level="info" additivity="false">
<appender-ref ref="monitorLogFile"/>
</Logger>
<Logger name="com.example" level="debug" />
<!--Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出;
level -> Root的属性,日志的输出级别;
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender. -->
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingRandomAccessFile" />
<AppenderRef ref="RollingRandomAccessFileWarn" />
<AppenderRef ref="RollingRandomAccessFileError" />
</Root>
</Loggers>
</Configuration>