第1步:依赖引入
引入log4j2的依赖spring-boot-starter-log4j2
并排除掉logback日志框架的依赖spring-boot-starter-logging
<!--log4j2-->
<!-- 排除 Spring-boot-starter 默认的日志配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
第2步:指定log4j2配置文件路径
通常在classpath
下添加。如果不想把配置放到classpath
下,可以在配置文件中自定义
位置
# 默认路径 : log4j2.xml 默认放在 src/main/resources 目录下
logging:
config: classpath:log4j2.xml
# 自定义位置:需明确指定
logging:
config: /home/userA/SpringBoot/config/log4j2.xml
[Ref] SpringBoot 2.x整合Log4j2日志
[Ref] SpringBoot—整合log4j2入门和log4j2.xml配置详解
第3步:log4j.xml 样例
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info" monitorInterval="10">
<properties>
<property name="LOG_HOME">./applog/logs</property>
<Property name="FILE_NAME" value="practisesvr"/>
<Property name="LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%thread] [%file:%line] → [%m]%n"/>
<!-- <Property name="LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%thread] [%file:%line] → [%enc{%m}{CRLF}]%n"/>-->
<!-- <Property name="LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSSSSS}] [%-5p] [%thread] [%file:%line] → [%replace{%enc{%m}{CRLF}}{\\r|\\n|%0D|%0A|%0a|%0d}{}]%n"/>-->
</properties>
<appenders>
<console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</console>
<File name="LOG_FILE"
fileName="${LOG_HOME}/appendLog.log"
append="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<RollingFile name="api_json"
fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/${FILE_NAME}_%d{yyyy-MM-dd-HH}_%i.log.gz"
createOnDemand="true">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="100K"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="*.log.gz">
<IfAny>
<IfAccumulatedFileSize exceeds="100M"/>
<IfAccumulatedFileCount exceeds="100"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="storage_check"
fileName="${LOG_HOME}/storage_check.log"
filePattern="${LOG_HOME}/storage_check_%d{yyyy-MM-dd-HH}_%i.log.gz"
createOnDemand="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="1M"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="*.log.gz">
<IfAny>
<IfAccumulatedFileSize exceeds="10M"/>
<IfAccumulatedFileCount exceeds="100"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders>
<loggers>
<root level="all">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="LOG_FILE"/>
</root>
<logger name="com.zhangziwa.practisesvr.utils.log.logUtils" level="info" additivity="false">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="api_json"/>
</logger>
<logger name="com.zhangziwa.practisesvr.utils.task.StorageHealthyCheckTask" level="info" additivity="false">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="storage_check"/>
</logger>
</loggers>
</configuration>
第4步:业务使用
import lombok.extern.log4j.Log4j2;
@Log4j2
public class Log4jTest {
public static void main(String[] args) throws InterruptedException {
int i = 1;
while (true) {
Thread.sleep(1000);
log.trace("这是测试trace" + i);
log.debug("这是测试debug" + i);
log.info("这是测试info" + i);
log.warn("这是测试warn" + i);
log.error("这是测试error" + i);
log.fatal("这是测试fatal" + i);
i++;
}
}
}