5

我正在从文本文件中读取标题并使用 log4j 将其添加到文件中。标头已成功插入,但它会在我的应用程序每次重新启动时插入标头,但我希望仅在创建文件时插入标头。我正在使用 DailyRollingFileAppender,这将在每个午夜滚动创建一个新文件。

我正在覆盖 PatternLayout 类的 getHeader 方法以将标题添加到文件中。

谁能帮我只插入一次标题(即仅在创建文件时)?

log4j.appender.ErrFileAppender=com.logger.ErrorFile
log4j.appender.ErrFileAppender.Threshold=WARN
log4j.appender.ErrFileAppender.File=${logdir}/Error.log
log4j.appender.ErrFileAppender.layout=com.logger.header.ErrHeader
log4j.appender.ErrFileAppender.DatePattern='.' yyyy-MM-dd
log4j.appender.ErrFileAppender.layout.ConversionPattern= %m%n
4

3 回答 3

4

我想出了解决方案。我正在做的是覆盖 log4j.FileAppender 的 setFile() 方法,并且仅在文件为空时添加了插入标头的逻辑。

这完美地工作。但我不确定是否有更好的解决方案。

于 2013-06-06T10:48:19.133 回答
4

我有同样的问题,您能否发布代码或您在覆盖 setFile 方法时实现的逻辑示例,以避免在每次重新启动应用程序时插入标头。

谢谢。

更新我想出了我们的方法,这是我的实现:

public class RegisterRollingFileAppender extends DailyRollingFileAppender {

    @Override
    public synchronized void setFile(String fileName) {
        // Your logic goes here
        super.setFile(fileName);
        File f = new File(super.getFile());
        RegisterPatternLayout layout = new RegisterPatternLayout();
        if (f.exists()) {
            if (f.length() == 0) {
                super.setLayout(layout);
            } else {
                PatternLayout p = new PatternLayout();
                p.setConversionPattern("%m%n");
                super.setLayout(p);
            }
        }
    }
}

其中RegisterPatternLayout 布局=我构建的覆盖方法的自定义布局类。getHeader()

无论如何,我想看看你的实现,谢谢!

于 2013-08-30T16:52:12.783 回答
1

Victor 的解决方案很好,但是有一个缺陷,例如,如果配置了 RollingFileAppender,那么显然你想在每个滚动文件中写入 header。但是,即使旧文件翻转并创建了新文件,@override setFile 也只会将一个标头插入旧文件。

我从这个讨论中找到了一个解决方案(https://groups.google.com/forum/#!topic/comp.lang.java.programmer/MKl0MT5gePo),它的建议是覆盖 writeHeader() 方法。这个 writeHeader 有修饰符 protected,所以我们需要在 org.apache.log4j 包中创建 ErrorFile

package org.apache.log4j;

public class ErrorFile extends DailyRollingFileAppender {
    @Override
    protected void writeHeader() {
        File f = new File(getFile());
        if (f.length() == 0) {
            super.writeHeader();
        }
    }
}

在您的 log4j.properties 中,从

log4j.appender.ErrFileAppender=com.logger.ErrorFile

log4j.appender.ErrFileAppender=org.apache.log4j.ErrorFile
于 2019-01-22T16:10:04.250 回答