MST

星途 面试题库

面试题:Java中如何使用log4j实现日志的轮转与归档

请阐述在Java项目中,配置log4j实现日志按时间(如每天)进行轮转以及归档存储的具体步骤和关键配置项。
45.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 添加log4j依赖

    • 如果使用Maven,在pom.xml中添加以下依赖:
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j - api</artifactId>
        <version>2.14.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j - core</artifactId>
        <version>2.14.1</version>
    </dependency>
    
  2. 创建log4j配置文件

    • 一般命名为log4j2.xml(也可以是log4j2.properties,这里以xml为例),放在src/main/resources目录下。
    • 关键配置如下:
    <?xml version="1.0" encoding="UTF - 8"?>
    <Configuration status="WARN">
        <Appenders>
            <RollingFile name="RollingFile" fileName="logs/app.log"
                         filePattern="logs/$${date:yyyy - MM - dd}/app-%d{yyyy - MM - dd}-%i.log.gz">
                <PatternLayout>
                    <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
                </PatternLayout>
                <Policies>
                    <TimeBasedTriggeringPolicy />
                    <SizeBasedTriggeringPolicy size="10MB"/>
                </Policies>
                <DefaultRolloverStrategy max="10"/>
            </RollingFile>
        </Appenders>
        <Loggers>
            <Root level="info">
                <AppenderRef ref="RollingFile"/>
            </Root>
        </Loggers>
    </Configuration>
    
    • 关键配置项解释
      • RollingFile:定义了滚动文件的相关配置。fileName指定当前日志文件路径和名称,filePattern指定日志文件按时间轮转后的路径和文件名模式,这里按日期分割,并使用gz压缩归档。
      • TimeBasedTriggeringPolicy:这是按时间轮转的策略,默认每天轮转一次。
      • SizeBasedTriggeringPolicy:定义了按文件大小进行轮转的策略,这里设置为10MB,即文件达到10MB时也会进行轮转。
      • DefaultRolloverStrategymax属性指定最多保留10个归档文件,超过时旧的文件会被删除。
  3. 在Java代码中使用

    • 在Java类中获取日志记录器:
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class MyClass {
        private static final Logger logger = LogManager.getLogger(MyClass.class);
    
        public void doSomething() {
            logger.info("This is an info log.");
        }
    }