8

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

所以,我正在考虑编写一个Appender——尽管我不确定它是否不是我真正需要的自定义布局。

1) 附加器

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

另一方面,如果我扩展RollingFileAppender了,我应该重写什么方法来装饰现有的功能?我如何告诉它只在文件的开头写入特定的字符串?

2) 布局

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

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

谢谢!

4

2 回答 2

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,就这么简单:<header> value </header>. 这会将它注入我的新附加程序的标头字段中。

似乎可以正常工作,但是如果您知道更好的方法,请发布!

于 2012-11-17T00:08:57.953 回答
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();
        }
    }
}
于 2015-02-19T20:10:59.747 回答