Log4j2 pom.xml 配置
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.23.1</version>
</dependency>
<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-slf4j-impl</artifactId>
<version>2.23.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Lo4j2配置文件
log4j2.properties
appender.console.type=Console
appender.console.name=console
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
appender.logFile.type=File
appender.logFile.name=logFile
appender.logFile.fileName=logs/info.log
appender.logFile.filePattern=logs/app-%d{yyyyMMdd}.log.gz
appender.logFile.layout.type=PatternLayout
appender.logFile.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
rootLogger.level=debug
rootLogger.appenderRef.stdout.ref=console
rootLogger.appenderRef.infoFile.ref=logFile
rootLogger.appenderRef.infoFile.level=info
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
<File name="logFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.log.gz">
<PatternLayout
pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</File>
<RollingFile name="fileLogger" fileName="${basePath}/logs/info.log" filePattern="${basePath}/app-info-%d{yyyy-MM-dd}.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug" additivity="false">
<AppenderRef ref="console" />
<AppenderRef ref="logFile" />
</Root>
</Loggers>
</Configuration>
动态日志路径
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.appender.FileAppender;
import org.apache.logging.log4j.core.config.LoggerConfig;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;
public class Main {
private static void resetLoggerFile(String logDir) throws IOException {
if (StringUtils.isBlank(logDir)) {
return;
}
Files.createDirectories(Paths.get(logDir));
Logger logger = ((Logger) LogManager.getRootLogger());
LoggerConfig config = logger.get();
config.stop();
FileAppender appender = (FileAppender) config.getAppenders().get("logFile");
FileAppender appenderNew = FileAppender.newBuilder()
.setName(appender.getName())
.withFileName(Paths.get(logDir, "info.log").toString())
.withAppend(true)
.setLayout(appender.getLayout())
.build();
config.removeAppender(appender.getName());
config.addAppender(appenderNew, logger.getLevel(), appender.getFilter());
config.start();
LogManager.getLogger(Main.class).info("update log dir to: "+ logDir);
}
public static void main(String[] args) throws IOException {
String config = System.getProperty("config");
if (StringUtils.isBlank(config)) {
return;
}
Properties properties = new Properties();
FileInputStream is = new FileInputStream(config);
properties.load(is);
String logPath = properties.getProperty("log.path", "./logs");
resetLoggerFile(logPath);
}
}