java - 如何将 log4j2 配置为在启动时使用时间戳翻转?

标签 java logging log4j log4j2

我有一个 Java 应用程序,它通过 cron 作业 (java -jar...) 每小时运行几分钟。它在自己的 JVM 中运行,而不是像 Tomcat 那样在持续运行的环境中运行。我正在使用 Log4j 2.11 进行日志记录。在应用程序中,我有一个具有特定翻转要求的特定记录器:

  1. 登录“rolling.log”
  2. 在每天结束时(或新一天的第一个日志记录事件),rolling.log 应该滚动到 rolling-yyyy-MM-dd.log.gz 并将新的日志记录事件添加到新的滚动.log.

我无法让翻转工作。所有日志消息都只发送到“rolling.log”,并且不会创建 rolling-yyyy-MM-dd.log.gz。为了尽可能以最简单的方式对此进行测试,我使用以下两个文件创建了一个简单的 Java 控制台应用程序。我希望只要系统时钟显示不同的分钟,日志文件就会在每次执行时滚动,但这并没有发生。

LoggingTest.java:

package log4jtest;

import java.time.Instant;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LoggingTest {

    private static final Logger logger = LogManager.getLogger();

    public static void main(String[] args) {
        System.out.println(Instant.now() + " - BEGIN: Logging to log4j");
        logger.error("Test log message");
        System.out.println(Instant.now() + " - DONE");
    }

}

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configuration>
<Configuration status="WARN">
    <Appenders>
        <RollingFile name="RollingLogFile"
            fileName="logs/rolling.log"
            filePattern="logs/rolling-%d{yyyy-MM-dd-HH-mm}.log.gz"
            createOnDemand="true">
            <PatternLayout
                pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true"
                    interval="1" />
                <OnStartupTriggeringPolicy />
            </Policies>
            <DefaultRolloverStrategy />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="RollingLogFile" />
        </Root>
    </Loggers>
</Configuration>

我的猜测是,由于托管应用程序的 JVM 和 Log4j 实例在发生翻转时未运行,因此不会触发翻转。

最终,我放弃了使用 RollingFileAppender,转而使用直接的 FileAppender:

<File name="RollingLogFile" 
        fileName=logs/rolling-${date:yyyy-MM-dd}.log"
        createOnDemand="true">
    <PatternLayout
        pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n" />
</File>

这是可行的,但它有一些缺点:

  1. 我无法监控简单命名的“rolling.log”(因为它不存在),但必须使用文件名的特定日期版本。
  2. 我无法在翻转功能上使用 log4j 的压缩。
  3. 我无法使用 log4j 的 delete on rollover 保留策略。

因此,重申一下,问题是:使用 log4j,以短时间间隔执行的应用程序是否可以像连续运行的应用程序一样使用基于时间的日志文件滚动策略?

最佳答案

请尝试以下配置:

<RollingFile name="LogSpecial" 
        fileName="${sys:special.directory}/special.csv" 
        filePattern="${sys:special.directory}/special-%d{yyyy-MM-dd}.csv.gz" 
        createOnDemand="true">
    <CsvParameterLayout />
    <Policies>
        <TimeBasedTriggeringPolicy modulate="true" interval="1" />
        <OnStartupTriggeringPolicy />
    </Policies>
    <DefaultRolloverStrategy>
    <Delete basePath="{sys:special.directory}">
      <IfFileName glob="special-*.csv.gz" />
      <IfLastModified age="60d" />
     </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

您还可以打开 log4j2.debug system property调试此配置并调查问题所在。

关于java - 如何将 log4j2 配置为在启动时使用时间戳翻转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48874164/

相关文章:

Pythonlogging.getLogger 在 AWS Glue python shell 作业中不起作用

python - 跨模块使用相同的日志记录级别进行日志记录

java - 日志4j |更新 Appender 的日志级别

java - 具有 log4j 和 commons 日志记录的多个不相关的日志文件

logging - 使用 PAX 日志记录时如何消除控制台中的日志记录启动消息?

java - 如何处理 "Property or field cannot be found on object in SpEL"?

java - Ant工具工作问题

java - 使用 commons-email-1.3 发送电子邮件时出错

java - native 查询 IN 子句抛出 sql 错误

java - log4j 在 Netbeans 中使用不正确的属性文件