当前位置: 首页 > 知识库问答 >
问题:

如何将log4j2配置为在启动时带时间戳翻转?

穆文斌
2023-03-14

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

    null
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");
    }

}
<?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>
<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的删除滚动保留策略。

因此,重新提出的问题是:使用log4j,在短时间内执行的应用程序是否可以像连续运行的应用程序那样使用基于时间的日志文件翻转策略?

共有1个答案

贺雅健
2023-03-14

请尝试以下配置:

<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系统属性来调试此配置并调查问题所在。

 类似资料:
  • 我在一个应用程序中使用log4j2进行日志记录,并且该应用程序部署在运行于伦敦、东京、纽约等地的服务器上。 我稍后汇总日志以进行分析。为了使其统一,我想将日志的时间戳转换为单个时区,例如GMT或EST。如何在log4j2中做到这一点?

  • 问题内容: 我正在寻找将UTC时间字符串转换为Unix时间戳的选项。 我拥有的字符串变量是,需要将其转换为unix时间戳,例如 任何想法如何做到这一点? 问题答案: 首先,unix时间戳没有时间,但以UTC为单位。 在包有功能解析与预计解析时的布局。布局是从参考时间开始构造的。因此,在您的情况下,布局应为。使用Parse之后,您将获得一个可以调用Unix来接收Unix时间戳的结构。

  • 然而,我想知道你如何将它转换成没有GMT或年份的时间和日期,例如Sat 04月03日14:00:00,这就是它 我的Add.java 我的配置文件.java 这里的任何帮助都将得到极大的理解。

  • 这是我在申请表中得到的日期: 将psqlDate转换为joda的最佳方式是什么? [编辑] 我可以使用解析方法。它可以很好地使用时间戳,它可以使用T-分割日期和时间的信息。 这应该与良好的模式一起工作: 带有时区的PostgreSQL时间戳的正确模式是什么?

  • 问题内容: 论坛成员 我在Java中遇到日期时间问题。实际上,我正在接收 格式为2012-02-27T01:10:10 的开始日期,并且我想将接收到的日期插入具有datetime数据类型的数据库中。 实际上,我尝试通过以下代码将收到的开始日期转换为日期时间 但是使用上面的代码,只有 日期被添加到我的数据库中,例如2012-02-27 00:00:00 我也想将时间添加到数据库中,但是当我将Simp

  • 问题内容: 如何在MySQL中转换为? 问题答案: 在MySQL中使用功能 请记住,如果使用的框架以毫秒为单位进行存储(例如Java的时间戳),则 必须除以1000 ,以秒为单位获取正确的Unix时间。