开发者社区 问答 正文

使用OnStartupTriggeringPolicy和DirectWriteRolloverStr

我正在使用2.12.1的log4j-slf4j-impl版本。以及将通过命令行执行并在完成后终止的应用程序。

该应用程序在本地主机中不会一次执行,但是有可能我们在先前的应用程序运行时再次运行它。因此,我想按yyyyMMdd-HHmmss分隔日志文件,然后在应用程序启动时,如果文件修改时间超过指定的时间(此处设置为1分钟),则删除日志文件。

我的log4j2.xml内容:

<RollingFile name="default"
             filePattern="${output.folder}/my.%d{yyyyMMdd-HHmmss}.log">
    <PatternLayout pattern="${pattern}" />
    <Policies>
        <OnStartupTriggeringPolicy minSize="0" />
    </Policies>

    <DirectWriteRolloverStrategy>
        <Delete basePath="${output.folder}" maxDepth="1">
            <IfFileName glob="my*.log" />
            <IfLastModified age="1m" />
        </Delete>
    </DirectWriteRolloverStrategy>
</RollingFile>

日志文件如下所示:

my.20191127-091410.log my.20191127-091415.log my.20191127-091527.log my.20191127-091533.log 问题是以上log4j2设置不起作用。旧的日志记录文件不会被删除。我的log4j2设置有问题吗?

我非常感谢您的任何评论。

展开
收起
垚tutu 2019-11-29 23:05:17 1061 分享 版权
阿里云 AI 助理回答

根据您的描述,您希望实现按时间戳命名日志文件,并在应用程序启动时删除超过1分钟的旧日志文件。从您提供的log4j2.xml配置来看,配置本身是用于滚动日志文件并按照日期时间格式命名的,但是直接通过Log4j2配置实现启动时删除特定时间以前的日志文件的功能并不直接支持。

不过,您可以考虑以下几种解决方案来实现您的需求:

1. 自定义Log4j2插件

最彻底的方式是开发一个自定义的Log4j2插件,在应用程序启动时执行检查和删除操作。这需要一定的编程工作,但能精确满足您的需求。参考官方文档了解如何编写自定义插件。

2. 使用Log4j2的Script条件

Log4j2支持使用Groovy或JavaScript脚本作为条件判断是否执行某些操作,比如删除旧日志。但请注意,直接在Log4j2配置中执行文件删除操作可能不是最佳实践,且可能存在安全风险。

3. 启动脚本中添加清理逻辑

一个更简单且常见的做法是在启动应用程序的shell脚本或批处理文件中,先执行一个清理命令来删除旧日志文件。例如,可以使用Linux的find命令结合您的时间条件来删除文件。示例代码如下(请根据实际路径和时间调整):

find /path/to/logs -name "my.*.log" -mmin +1 -delete

这条命令会查找所有以my.开头,后跟日期时间戳.log的文件,如果它们的修改时间超过1分钟,则删除这些文件。

4. 定期任务清理

如果允许的话,也可以设置一个定时任务(如cron job),定期清理旧日志,而不是在每次应用启动时执行。这样可以减少应用启动时的复杂性。

综上所述,考虑到实施的简易性和安全性,建议采用启动脚本中添加清理逻辑的方法,或者评估是否有必要开发自定义插件以满足更复杂的业务需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: