我正在使用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设置有问题吗?
我非常感谢您的任何评论。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的描述,您希望实现按时间戳命名日志文件,并在应用程序启动时删除超过1分钟的旧日志文件。从您提供的log4j2.xml
配置来看,配置本身是用于滚动日志文件并按照日期时间格式命名的,但是直接通过Log4j2配置实现启动时删除特定时间以前的日志文件的功能并不直接支持。
不过,您可以考虑以下几种解决方案来实现您的需求:
最彻底的方式是开发一个自定义的Log4j2插件,在应用程序启动时执行检查和删除操作。这需要一定的编程工作,但能精确满足您的需求。参考官方文档了解如何编写自定义插件。
Log4j2支持使用Groovy或JavaScript脚本作为条件判断是否执行某些操作,比如删除旧日志。但请注意,直接在Log4j2配置中执行文件删除操作可能不是最佳实践,且可能存在安全风险。
一个更简单且常见的做法是在启动应用程序的shell脚本或批处理文件中,先执行一个清理命令来删除旧日志文件。例如,可以使用Linux的find
命令结合您的时间条件来删除文件。示例代码如下(请根据实际路径和时间调整):
find /path/to/logs -name "my.*.log" -mmin +1 -delete
这条命令会查找所有以my.
开头,后跟日期时间戳.log
的文件,如果它们的修改时间超过1分钟,则删除这些文件。
如果允许的话,也可以设置一个定时任务(如cron job),定期清理旧日志,而不是在每次应用启动时执行。这样可以减少应用启动时的复杂性。
综上所述,考虑到实施的简易性和安全性,建议采用启动脚本中添加清理逻辑的方法,或者评估是否有必要开发自定义插件以满足更复杂的业务需求。