我需要的功能是在配置的日志文件的开头写一个标题行。此外,日志文件应根据时间模式滚动(我说的是logback 1.0.7)。
所以,我正在考虑写一个 Appender - 虽然我不确定它是不是我真正需要的自定义布局。
1)Appender
根据logback的文档,正确的方法是扩展AppenderSkeleton
,但是如何将它与RollingFileAppender
结合起来(以使文件翻转?)
另一方面,如果我扩展RollingFileAppender
,我会覆盖哪种方法来装饰现有功能?我怎么告诉它只在文件的开头写这个特定的字符串?
2)布局
类似地,该方法似乎正在扩展LayoutBase
,并为doLayout(ILoggingEvent event)
提供实现。
但同样,我不知道如何装饰行为 - 只是在文件中添加一个新行,而不是破坏其功能(因为我仍然希望其余日志正确显示)。
getFileHeader()
中的LayoutBase
看起来很有希望,但我该如何使用它?是否打算被自定义布局覆盖? (可能是的,因为它是Layout界面的一部分,但是如何?)
谢谢!
答案 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();
}
}
}