每N行log4j头

每N行log4j头,log4j,Log4j,我需要每N行日志添加一个log4j页眉和页脚。我知道如何通过重写PatternLayout类的getHeader()/getFooter()方法来指定log4j页眉/页脚。但是,这似乎仅限于在每个滚动日志文件中只包含一次页眉/页脚(顶部/底部)(在我的例子中是每天) 谢谢 对布局类进行子类化是不够的。如果您还创建了自己的appender子类,我想在您的情况下是RollingFileAppender,那么它将起作用。您可以重写append()方法,以便它计算写入文件的行数(实际上是写入的记录数),

我需要每N行日志添加一个log4j页眉和页脚。我知道如何通过重写PatternLayout类的getHeader()/getFooter()方法来指定log4j页眉/页脚。但是,这似乎仅限于在每个滚动日志文件中只包含一次页眉/页脚(顶部/底部)(在我的例子中是每天)


谢谢

对布局类进行子类化是不够的。如果您还创建了自己的appender子类,我想在您的情况下是RollingFileAppender,那么它将起作用。您可以重写append()方法,以便它计算写入文件的行数(实际上是写入的记录数),然后根据行数调用writeHeader()/writeFooter()

以下实现允许您通过
headerFrequency
属性设置在配置文件中写入标头的频率:

public class MyRollingFileAppender extends RollingFileAppender {
  // number of lines after which the header is written
  private int headerFrequency = -1;
  // Count of lines written by the appender
  private int nbLines = 0;

  @Override
  public void append(final LoggingEvent event) {
    super.append(event);
    nbLines++;
    if ((headerFrequency > 0) &&
        (nbLines % headerFrequency == 0)) {
      writeHeader();
    }
  }

  public int getHeaderFrequency() {
    return headerFrequency;
  }

  public void setHeaderFrequency(final int headerFrequency) {
    this.headerFrequency = headerFrequency;
  }
}
布局的以下实现也允许您在log4j配置文件中实际设置标题文本:

public class MyLayout extends PatternLayout {
  // The header
  private String header = null;

  @Override
  public String getHeader() {
    return header;
  }

  public void setHeader(String header) {
    this.header = header;
  }
}
然后您可以在log4j配置中使用它,如下所示:

log4j.appender.CUSTOM=test.MyRollingFileAppender
log4j.appender.CUSTOM.HeaderFrequency=100
... other appender properties ...
log4j.appender.CUSTOM.layout=test.MyLayout
log4j.appender.CUSTOM.layout.Header=***** This is my header *****\n
... other layout properties ...

log4j.rootLogger=INFO, CUSTOM

有道理。非常感谢。很高兴听到。如果这解决了你的问题,你可能会想对答案投更高的票。它不会让我,说我至少需要15个声誉。