pom文件
java
<!--log4j2的依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.23.1</version>
</dependency>
log4j2.xml
java
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<loggers>
<root level="DEBUG">
<appender-ref ref="spring6log"/>
</root>
</loggers>
<appenders>
<console name="spring6log" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger-{1024} - %msg%n"/>
</console>
</appenders>
</configuration>
pattern定义日志输出格式:
配置 说明
%d{HH:mm:ss.SSS} 输出日志打印的时间,精确到毫秒
[%t] 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,不足在右边补空格
%logger{36} 输出logger名称,一般是类的全限定路径名
%msg 输出要打印的业务日志信息
%n 日志换行
实际会输出如下日志:
java
11:33:08.438 [main] ERROR org.apache.logging.log4j.Log4j2Test - error level log
Log4j2共有8种日志级别,
按照优先级从小到大排序:
java
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
java
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--properties-->
<properties>
<!-- 运行日志位置-->
<property name="LOG_HOME">logs</property>
<!-- info日志滚动仓库-->
<property name="LOG_REPO">logs/%d{yyyy-MM-dd}</property>
<!-- 错误日志滚动仓库-->
<property name="WARN_REPO">logs/error</property>
<!--日志格式-->
<property name="LOG_PATTERN">%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n</property>
<!--文件过期时间-->
<property name="LOG_EXPIRE">15d</property>
<!--单文件大小-->
<property name="LOG_SIZE">100MB</property>
</properties>
<!--appenders -->
<appenders>
<!--控制台输出配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!--输出日志的格式 -->
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!--打印出所有的info信息,每小时滚动一次,单文件最大100M,文件最多保留15天 -->
<RollingFile name="InfoFile" fileName="${LOG_HOME}/game.log"
filePattern="${LOG_REPO}/game.%d{yyyy-MM-dd-HH}.%i.log">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--每小时滚动一次,单文件最大100M-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="10">
<!-- 每个文件最长保留时长=>15天-->
<Delete basePath="logs/" maxDepth="2">
<IfFileName regex=".*log" />
<IfLastModified age="${LOG_EXPIRE}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!--打印出所有的warn/error信息,单文件最大100M后滚动,文件最多保留15天 -->
<RollingFile name="WarnFile" fileName="${LOG_HOME}/game.warn.log"
filePattern="${WARN_REPO}/game.%d{yyyy-MM-dd}.%i.log">
<Filters>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--单文件最大100M-->
<SizeBasedTriggeringPolicy size="${LOG_SIZE}"/>
</Policies>
<DefaultRolloverStrategy>
<!-- 每个文件最长保留时长=>15天-->
<Delete basePath="logs/" maxDepth="2">
<IfFileName regex=".*log" />
<IfLastModified age="${LOG_EXPIRE}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!--运行日志-->
<logger name="com.msgame" additivity="false">
<level value="INFO"/>
<appenderRef ref="InfoFile"/>
<appenderRef ref="WarnFile"/>
<appenderRef ref="Console"/>
</logger>
<!--默认日志 -->
<root level="info">
<appender-ref ref="InfoFile"/>
</root>
</loggers>
</configuration>
测试代码
java
package org.apache.logging.log4j;
public class Log4j2Test {
private static Logger LOG = LogManager.getLogger(Log4j2Test.class);
public static void main(String[] args) throws Exception {
// 一直打印日志,用于测试Log4j2功能
while (true) {
logAll();
}
}
// 打印各种级别的日志用于测试
public static void logAll() throws Exception {
LOG.trace("trace level log");
LOG.debug("debug level log");
LOG.info("info level log");
LOG.error("error level log");
LOG.fatal("fatal level log");
// 设置休眠时间(单位ms),控制日志打印速度
Thread.sleep(3);
}
}