如何避免在使用log4j重启服务器时向文件插入头文件?

zqdjd7g9  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(327)

我从一个文本文件中读取一个头文件,并使用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
vddsk6oq

vddsk6oq1#

victor的解决方案很好,但是有一个缺陷,例如,如果配置了rollingfileappender,那么显然您希望在每个滚动文件中写入头。然而@override setfile只会在旧文件中插入一个头文件,即使旧文件被翻滚并创建了新文件。
我从这次讨论中找到了解决办法(https://groups.google.com/forum/#!topic/comp.lang.java.programmer/mkl0mt5gepo),其建议是重写writeheader()方法。这个writeheader有修饰符保护,所以我们需要在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
hvvq6cgz

hvvq6cgz2#

我也有同样的问题,你能不能在重写setfile方法时发布代码或逻辑示例,以避免每次重新启动应用程序时插入header。
谢谢。
更新我计算了我们的方法,以下是我的实现:

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=my custom layout class i constructed overriding getHeader() 方法。
不管怎样,我想看看你的执行情况,谢谢!

xghobddn

xghobddn3#

我想出了解决办法。我要做的是重写log4j.fileappender的setfile()方法,在这里我添加了只在文件为空时插入头的逻辑。
这很管用。但我不确定是否有更好的解决办法。

相关问题