Log4j2配置及使用

时间:2023-08-30 13:14:14
Log4j2:一个日志管理工具。Log4j的升级版,需要Java6以上
一、安装log4j2依赖包
1、通过maven的pom.xml直接引入jar:
log4j-api和log4j-core
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
2、通过官网下载jar包直接引入到工程内
二、log4j2的配置文件
1、配置文件位置和命名规则
以下为官网内容,按照1-8的顺序优先查找文件,优先使用【log4j.configurationFile】
说明:如果是log4j2.xml文件直接放到resources工程资源文件目录下即可。
  1. Log4j will inspect the "log4j.configurationFile" system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension.
  2. If no system property is set the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
  3. If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
  4. If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
  5. If a test file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
  6. If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
  7. If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
  8. If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.
2、配置详解
下面列出的是XML格式文件的配置方法,也可以用Json的格式配置,官网上有介绍:http://logging.apache.org/log4j/log4j-2.3/manual/configuration.html
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR">
<!--Configuration 配置项
status:log4j本身的日志级别, “trace”, “debug”, “info”, “warn”, “error” and “fatal”
monitorInterval:每隔多少秒从新读取配置文件,可以在不重启的情况下修改配置-->
<Appenders>
<!--Appenders定义日志输出,有Console、File、RollingRandomAccessFile、MongoDB、Flume 等
有Console:输出源到控制台
File:将日志输出到文件,通过fileName指定存储到的文件(目录不存在会自动创建)
RollingRandomAccessFile:也是写入文件,但可以定义规则按照文件大小或时间等重新创建一个新的日志文件存储;如果是按时间分割需要配合filePattern使用
-->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %F %logger{36} - %msg%n"/>
<!--PatternLayout指定输出日志的格式 -->
</Console>
<File name="debuglog" fileName="./log/debug.log" append="true”>
<!--fileName为存储日志的文件地址;append为是否在已有文件上追加,true为追加,false为重建-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<RollingFile name="customscript" fileName="${LOG_HOME}${FILE_NAME}" filePattern="${LOG_HOME}${FILE_NAME}.%d{yyyy-MM-dd}.log">
<!—filePattern为分割存储的日志的名字;必须加Policies,分割方式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %M %L - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!--日志器,通过LogManager.getLogger(日志器name)的日志器名字决定使用具体哪个日志器
分为根Root日志器和自定义日志器-->
<Root level="ERROR">
<!--当根据名字找不到对应的日志器时,使用Root的日志器
leve:日志输出等级(默认ERROR);TRACE > DEBUG > INFO > WARN > ERROR, ALL or OFF-->
<AppenderRef ref="Console"/>
<!--AppenderRef:关联Appenders中定义的输出规则,可以有多个,日志可以同时输出到多个地方-->
<AppenderRef ref="debuglog"/>
</Root>
<Logger name="customlog" level="INFO" additivity="false">
<!--Logger自定义日志器:
name为日志器的名字,通过LogManager.getLogger(日志器name)获得该日志器连接
additivity:相加性。默认为true,若为true会将当前日志内容也打印到它上面的日志器内,这里上面日志器是Root-->
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
更多日志输出格式(PatternLayout)

%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行

其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数

RollingRandomAccessFile的更多配置项

fileName 指定当前日志文件的位置和文件名称
filePattern 指定当发生Rolling时,文件的转移和重命名规则
SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
DefaultRolloverStrategy 指定最多保存的文件个数
TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟
TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件

RollingFile的更多配置
分割日志文件。
filePattern 指定当发生Rolling时,文件的转移和重命名规则
Policies:分割方式,按照时间或文件大小分割
举例如下:
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="25 KB" />
</Policies> 
TimeBasedTriggeringPolicy:按照RollingFile的filePattern中%d的细粒度分割;如果是到dd天,则按天分割,如果到HH按照小时分割
SizeBasedTriggeringPolicy:按照指定大小分割文件

三、Java

package util;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; public class Log { static final Logger logger_root = LogManager.getLogger(Log.class.getName());//配置文件没配置Log的class名字,所以用默认的Root
static final Logger logger_custom = LogManager.getLogger("customlog");//配置文件定义了customlog,所以用customlog public static void main(String[] args) {
// 记录debug级别的信息
logger_root.debug("This is debug message.");
// 记录info级别的信息
logger_root.info("This is info message.");
// 记录error级别的信息
logger_root.error("This is error message."); // 记录debug级别的信息
logger_custom.debug("This is debug message.");
// 记录info级别的信息
logger_custom.info("This is info message.");
// 记录error级别的信息
logger_custom.error("This is error message.");
}
}
说明:
LogManager.getLogger(Log名字):获得一个Logger对象
通过Logger对象的.debug等输出日志(trace、debug、info、warn、error、fatal)
执行结果:
15:23:53.087 [main] ERROR Log.java util.Log - This is error message.
15:23:53.096 [main] INFO  Log.java customlog - This is info message.
15:23:53.097 [main] ERROR Log.java customlog - This is error message.
命中Root的log文件输出如下:
15:33:27.947 ERROR util.Log 17 main - This is error message.