teo*_*teo 8 layout logback rollingfileappender appender
我需要的功能是在配置的日志文件的开头写一个标题行.此外,日志文件应该根据时间模式滚动(我说的是logback 1.0.7).
所以,我正在考虑编写一个Appender - 虽然我不确定它是不是我真正需要的自定义布局.
1)Appender
根据logback的文档,正确的方法是扩展AppenderSkeleton,但那么我将如何将其与RollingFileAppender(以使文件翻转?)相结合?
另一方面,如果我扩展RollingFileAppender,我会覆盖哪种方法来装饰现有的功能?我怎么告诉它只在文件的开头写这个特定的字符串?
2)布局
类似地,该方法似乎正在扩展LayoutBase,并提供实现doLayout(ILoggingEvent event).但同样,我不知道如何装饰行为 - 只是在文件中添加一个新行,而不是破坏其功能(因为我仍然希望其余日志正确显示).
将getFileHeader()在LayoutBase看起来很有希望,但我要如何使用它?是否打算被自定义布局覆盖?(可能是的,因为它是Layout界面的一部分,但那又怎么样?)
谢谢!
teo*_*teo 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在logback.xml中配置了标头,就像这样简单:<header> value </header>.这会将它注入我的新appender的头字段中.
似乎没有问题,但如果你知道更好的方法请发布!
您的解决方案有一个问题:它删除每个新文件的第一行日志.我想这是因为你写了标题,而文件是通过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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3732 次 |
| 最近记录: |