Apache Log4j2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.
既然Log4j2相比Log4j和Logback有了这么多的优势,那么用就完事了。
log4j2 特点
- The Log4j API supports logging Messages instead of just Strings.
- The Log4j API supports lambda expressions.
- The Log4j API provides many more logging methods than SLF4J.
- Improved Performance,使用多线程,相比log4j和logback,效率提高18倍。
-
Automatic Reloading of Configurations
log4j2配置结构
一句话概括Loggers和Appenders之间的关系:Appenders指定输出文件的级别和输出文件的位置,Loggers指定哪些包的log由哪一个Appeders输出
- Configuration
- Appenders
- RollingFile
- File
- Console
- Loggers
- Appenders
- configuration
根节点,有两个属性,status 和 monitorinterval- status
status 用来指定打印的级别(trace,debug,info,warn,error,fatal) - monitorinterval
用来默认加载log4j2配置文件,单位为秒,如设置<configuration monitorinterval="30">
代表每30秒会加载一次配置文件,所以在30秒内修改配置文件可以修改log的使用
- status
- Appenders
输出源,定义日志输出的地方。-
输出方式:
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间
%-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%c : logger的名称(%logger)
%t : 输出当前线程名称
%p : 日志输出格式
%m : 日志内容,即 logger.info("message")
%n : 换行符
%C : Java类名(%F)
%L : 行号
%M : 方法名
%l : 输出语句所在的行数, 包括类名、方法名、文件名、行数
hostName : 本地机器名
hostAddress : 本地ip地址
摘自https://www.cnblogs.com/keeya/p/10101547.html -
输出源类别
RollingFile特有Policies 来确定什么时候生成文件。
Console,File,RollingFile等
公共部分
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
PatternLayout:输出格式,不设置默认为:%m%n.xml <RollingFile name="RollingFileRoot" fileName="/opt/logs/api/root.log" filePattern="/opt/logs/api/root-%d{yyyy-MM-dd}-%i.log"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/> <Policies> <!--按天分配--> <TimeBasedTriggeringPolicy interval="1"/> <!--按大小分配--> <SizeBasedTriggeringPolicy size="1GB"/> </Policies> </RollingFile>
-
- Loggers
给不同的包自定义日志级别。在Loggers中配置哪些包输出到哪些文件里(使用AppenderRef去指定appender中设置的输出位置)- root
- root为根记录器,不手动设置默认在 LoggerConfig,级别为ERROR且输出在 Console(控制台)
- root 没有name和additivity属性
- Logger
- Logger 有name属性,为具体的包(com.xxx.api.dao)
- Logger level属性(trace/warn/error等) 可以控制输出的级别
- Logger additivity属性(true/false) 可以控制是否将这些包中输出的信息也写到root对应的Log中去。建议使用false来不写入。
- root
springboot 使用 log4j2
在maven 中引入依赖
<!--取消在starter.web中自带的spring-boot-starter-logging,在starter.web中采用的是logback-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加log4J2依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFileRoot" fileName="/opt/logs/api/root.log"
filePattern="/opt/logs/api/root-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="/opt/logs/api/warn.log"
filePattern="/opt/logs/api/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<!--<DefaultRolloverStrategy max="20"/>-->
</RollingFile>
<RollingFile name="RollingFileError" fileName="/opt/logs/api/error.log"
filePattern="/opt/logs/api/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile>
<RollingFile name="MyBatisFile" fileName="/opt/logs/api/dao.log"
filePattern="/opt/logs/api/dao-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile>
<RollingFile name="requestLog" fileName="/opt/logs/api/request.log"
filePattern="/opt/logs/api/request-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFileRoot"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
</Root>
<Logger name="com.xxx.api.dao" level="WARN" additivity="false">
//为dao mapper所在的包,level为TRACE
<AppenderRef ref="MyBatisFile"/>
</Logger>
<Logger name="requestLogger" level="TRACE" additivity="false">
<AppenderRef ref="requestLog"/>
</Logger>
</Loggers>
</Configuration>