Layout 自定义Logback Appender-预先设置文件头并使其滚动

Layout 自定义Logback Appender-预先设置文件头并使其滚动,layout,logback,appender,rollingfileappender,Layout,Logback,Appender,Rollingfileappender,我需要的功能是在配置的日志文件开头写入标题行。此外,日志文件应该根据时间模式(我说的是logback 1.0.7)进行滚动 因此,我正在考虑编写一个追加器——尽管我不确定它是否是我实际需要的自定义布局 1) 追加器 根据logback的文档,正确的方法是扩展AppenderSkeleton,但是我如何将其与RollingFileAppender(进行文件滚动)结合起来呢 另一方面,如果我扩展了RollingFileAppender,我应该重写什么方法来装饰现有的功能?我如何告诉它只在文件的开头写

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

因此,我正在考虑编写一个追加器——尽管我不确定它是否是我实际需要的自定义布局

1) 追加器

根据logback的文档,正确的方法是扩展
AppenderSkeleton
,但是我如何将其与
RollingFileAppender
(进行文件滚动)结合起来呢

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

2) 布局

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

LayoutBase
中的
getFileHeader()
看起来很有前途,但我该如何使用它呢?它甚至可以被自定义布局覆盖吗?(可能是的,因为它是布局界面的一部分,但是怎么做?)


谢谢大家!

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

我没有扩展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中配置了头,很简单:
value
。这会将其注入我的新appender的header字段中


似乎工作没有问题,但请做后,如果你知道一个更好的方法

您的解决方案有一个问题:它会删除每个新文件的第一行日志。我认为这是因为您编写了头文件,而文件是通过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();
        }
    }
}

@您知道如何在任何自定义Appender类的start方法中获得logback.xml中定义的自定义属性吗?