gpt4 book ai didi

log4j - 如何在文件名中包含日期/时间并删除旧日志?

转载 作者:行者123 更新时间:2023-12-01 05:34:14 28 4
gpt4 key购买 nike

我的老板要求我有一个日志记录解决方案,其中

  • 所有日志文件的文件名中都有日期/时间(例如 myapp.2-28-2012.log)
  • 仅保留最新的日志文件。删除较旧的日志文件,以免硬盘空间不足

  • 似乎使用 log4j 我只能得到一个或另一个标准,但不能同时得到两个。使用 log4j extras TimeBasedRollingPolicy,我可以让日志文件包含日期/时间,满足 1。但是,似乎没有办法让 TimeBasedRollingPolicy 删除旧的日志文件。根据这个 post不可能让 TimeBasedRollingPolicy 删除旧的日志文件

    使用 log4j extras FixedWindowRollingPolicy 和 SizeBasedTriggeringPolicy 我可以让 log4j 删除除最后 10 个日志文件之外的所有文件,这样我的硬盘驱动器就不会用完空间,填满 2。但是我无法得到这个解决方案来输入日期/时间文件名。有了这个配置
    def myAppAppender = new org.apache.log4j.rolling.RollingFileAppender(name: 'myApp', layout: pattern(conversionPattern: "%m%n"))
    def rollingPolicy = new org.apache.log4j.rolling.FixedWindowRollingPolicy(fileNamePattern: '/tmp/myapp-%d{MM-dd-yyyy_HH:mm:ss}.log.%i',maxIndex:10,activeFileName: '/tmp/myapp.log')
    rollingPolicy.activateOptions()
    def triggeringPolicy = new org.apache.log4j.rolling.SizeBasedTriggeringPolicy(maxFileSize:10000000)
    triggeringPolicy.activateOptions()
    eventAppender.setRollingPolicy(rollingPolicy)
    eventAppender.setTriggeringPolicy(triggeringPolicy)

    滚动日志文件不包含日期/时间。他们看起来像这样
    myapp-.log.1
    myapp-.log.2
    ...

    log4j 是否可以同时满足标准 1) 和 2)?我是否必须继承 TimeBasedRollingPolicy?如果是这样,我应该覆盖哪些方法?

    最佳答案

    通常在 Log4j 中很难做到,但您始终可以根据您的特定需求扩展策略,如下所示。

    您首先需要将 TimeBasedRollingPolicy 源代码复制粘贴到一个新类中,例如 MyAppDeletingTimeBasedRollingPolicy。 Apache 许可证允许这样做。

    关键部分是根据您的需要实现删除逻辑。下面是我的类,它删除了以“myapp-debug”开头并以“gz”结尾的文件,并且在3天内没有修改过。您可能需要其他检查,因此在盲目复制和粘贴代码时要小心。

    private static class DeleteOldMyAppLogFilesInDirAction extends ActionBase {

    private static final long MAX_HISTORY = 3l * 24 * 60 * 60 * 1000; //3 days
    private File dir;

    public DeleteOldMyAppLogFilesInDirAction (File dir) {
    this.dir = dir;
    }

    @Override
    public boolean execute() throws IOException {
    for (File f : dir.listFiles()) {
    if (f.getName().startsWith("myapp-debug.") && f.getName().endsWith(".gz")
    && f.lastModified() < System.currentTimeMillis() - MAX_HISTORY) {
    f.delete();
    }
    }
    return true;
    }

    }

    然后你需要从这里更改返回值:
        return new RolloverDescriptionImpl(nextActiveFile, false, renameAction, compressAction);

    对此:
        Action deleteOldFilesAction = new DeleteOldMyAppLogFilesInDirAction (new File(currentActiveFile).getParentFile());
    List<Action> asynchActions = new ArrayList<Action>();
    if (compressAction != null) {
    asynchActions.add(compressAction);
    }
    asynchActions.add(deleteOldFilesAction);

    return new RolloverDescriptionImpl(nextActiveFile, false, renameAction, new CompositeAction(asynchActions, false));

    此类中有一些硬编码假设,例如文件名和与当前文件位于同一目录中的旧文件,请小心这些假设,并乐于根据自己的需要修改自己的方式。

    关于log4j - 如何在文件名中包含日期/时间并删除旧日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9726979/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com