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