Log4j2配置及动态修改日志路径

236 阅读1分钟

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>
    <!-- 日志组件依赖 -->
    <!-- 常用工具Jar依赖 -->
    <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>
    <!-- 常用工具Jar依赖 -->
    

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Lo4j2配置文件

log4j2.properties

# 控制台(console)
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

# 日志文件(logFile)
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);

    }
}