自定义日志附加程序 - 预先添加文件标题并进行翻转

时间:2012-11-08 18:21:20

标签: layout logback appender rollingfileappender

我需要的功能是在配置的日志文件的开头写一个标题行。此外,日志文件应根据时间模式滚动(我说的是logback 1.0.7)。

所以,我正在考虑写一个 Appender - 虽然我不确定它是不是我真正需要的自定义布局

1)Appender

根据logback的文档,正确的方法是扩展AppenderSkeleton,但是如何将它与RollingFileAppender结合起来(以使文件翻转?)

另一方面,如果我扩展RollingFileAppender,我会覆盖哪种方法来装饰现有功能?我怎么告诉它只在文件的开头写这个特定的字符串?

2)布局

类似地,该方法似乎正在扩展LayoutBase,并为doLayout(ILoggingEvent event)提供实现。 但同样,我不知道如何装饰行为 - 只是在文件中添加一个新行,而不是破坏其功能(因为我仍然希望其余日志正确显示)。

getFileHeader()中的LayoutBase看起来很有希望,但我该如何使用它?是否打算被自定义布局覆盖? (可能是的,因为它是Layout界面的一部分,但是如何?)

谢谢!

2 个答案:

答案 0 :(得分:11)

我在回答我自己的问题,以防其他人遇到同样的问题。 这就是我最终做到的方式(不知道它是否是正统的方式):

我没有扩展AppenderSkeleton,而是扩展了RollingFileAppender(以保持翻转功能),并覆盖了它的openFile()方法。在这里,我可以操作日志文件并在其中执行标题之后,让它执行默认情况下需要执行的操作。像这样:

 public void openFile(String fileName) throws IOException {
        super.openFile(fileName);
        File activeFile = new File(getFile());
        if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) {
            FileUtils.writeStringToFile(activeFile, header);
        }
  }

我在logback.xml中配置了标头,就像这样简单:<header> value </header>。这会将它注入我的新appender的头字段中。

似乎没有问题,但如果你知道更好的方法请发帖!

答案 1 :(得分:5)

您的解决方案存在问题:它会删除每个新文件的第一行日志。我想这是因为你写了标题,而文件是通过logback打开的。 我找到了另一个没有这个问题的解决方案:

public void openFile(String fileName) throws IOException
{
    super.openFile(fileName);
    File activeFile = new File(getFile());
    if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0)
    {
        lock.lock();
        try
        {
            new PrintWriter(new OutputStreamWriter(getOutputStream(), StandardCharsets.UTF_8), true).println("your header");
        }
        finally
        {
            lock.unlock();
        }
    }
}