我正在使用 Apache commons 日志库和 log4j 来生成我的日志文件。
现在我想在每次运行程序时创建一个新文件。当前计数应附加到日志文件的名称中。
例如:program_1.log program_2.log program_3.log
你知道我怎么能做到这一点吗?
我正在使用 Apache commons 日志库和 log4j 来生成我的日志文件。
现在我想在每次运行程序时创建一个新文件。当前计数应附加到日志文件的名称中。
例如:program_1.log program_2.log program_3.log
你知道我怎么能做到这一点吗?
我认为这不受 log4j 支持,因此您应该创建自己的实现,扩展 FileAppender:
public class CustomAppender extends FileAppender {
...
public
CustomAppender(Layout layout, String filename, boolean append, boolean bufferedIO,
int bufferSize) throws IOException {
this.layout = layout;
// file name will be the basis; you should calculate the suffix yourself
customname = filename + ...
this.setFile(customname, append, bufferedIO, bufferSize);
}
...
本文给出了如何写入动态确定的日志文件的示例。这使您可以灵活地确定程序启动时所需的文件名。
最难的部分是知道当前的计数是多少。对文件名进行二进制搜索以找到最大编号的文件名可能是最简单的 - 这不会太糟糕 - 需要 log n 文件存在测试,其中 n 是日志数。如果您有 100 万条日志,那么只有 20 次文件检查。
根据要求将我的评论变成答案:
为什么你不想使用时间戳?当我必须回顾日志文件时,我发现它们作为后缀更有意义。
似乎普通的 Log4J 不支持这一点。但是,有一个 Log4J Extras Companion,包含它自己的RollingFileAppender,它似乎可以通过RollingPolicy和TriggeringPolicy参数自由配置。因此,您可以尝试实施自己的政策。
我假设您打算为每个 JVM 实例创建一个新文件。我认为您可以通过扩展FileAppender来实现(不是微不足道但并不困难)。您可以查看DatedFileAppender的代码以获得一些灵感。
以一种不太优雅的方式,每次您的程序运行时,它都可以创建一个文件 log_num.dat,它将跟踪一个数字(下一个要创建的日志文件)。
这对我有用,
<appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Threshold" value="TRACE" />
<param name="File" value="amLog.log"/>
<param name="DatePattern" value="'.'YYYY-MM-dd-HH-mm"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>