3

我正在使用 Apache commons 日志库和 log4j 来生成我的日志文件。

现在我想在每次运行程序时创建一个新文件。当前计数应附加到日志文件的名称中。

例如:program_1.log program_2.log program_3.log

你知道我怎么能做到这一点吗?

4

7 回答 7

1

我认为这不受 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);
  }

 ...
于 2010-06-01T13:55:50.147 回答
1

本文给出了如何写入动态确定的日志文件的示例。这使您可以灵活地确定程序启动时所需的文件名。

最难的部分是知道当前的计数是多少。对文件名进行二进制搜索以找到最大编号的文件名可能是最简单的 - 这不会太糟糕 - 需要 log n 文件存在测试,其中 n 是日志数。如果您有 100 万条日志,那么只有 20 次文件检查。

于 2010-06-01T13:58:31.137 回答
1

根据要求将我的评论变成答案:

为什么你不想使用时间戳?当我必须回顾日志文件时,我发现它们作为后缀更有意义。

于 2010-06-10T13:27:56.907 回答
0

似乎普通的 Log4J 不支持这一点。但是,有一个 Log4J Extras Companion,包含它自己的RollingFileAppender,它似乎可以通过RollingPolicyTriggeringPolicy参数自由配置。因此,您可以尝试实施自己的政策。

于 2010-06-01T13:51:50.027 回答
0

我假设您打算为每个 JVM 实例创建一个新文件。我认为您可以通过扩展FileAppender来实现(不是微不足道但并不困难)。您可以查看DatedFileAppender的代码以获得一些灵感。

于 2010-06-01T13:54:56.900 回答
0

以一种不太优雅的方式,每次您的程序运行时,它都可以创建一个文件 log_num.dat,它将跟踪一个数字(下一个要创建的日志文件)。

于 2010-06-01T13:56:54.853 回答
0

这对我有用,

<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>

于 2010-09-06T18:28:40.700 回答