使用Logback在每个日志文件的开头添加一个表达式

Peg*_*ahK 0 java logging logback

我有一个包含多个模块的项目。每个模块都有自己的logback.xml。他们的附加程序是滚动文件。如何在每个输出日志文件的开头添加特定的表达式?

gly*_*ing 5

您可以将标题添加到由创建的每个文件中(Rolling)FileAppender

以下配置将实现此目的:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>target/test.log</file>
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <fileHeader>Your File Header ...</fileHeader>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </layout>
    </encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)

通过上述配置,Logback子系统的任何实例在写入给定文件的第一行之前,将出现以下文本:

Your File Header ...
Run Code Online (Sandbox Code Playgroud)

注意:如果您的应用程序重新启动(或在应用程序中重新初始化了Logback),则PatternLayout将会再次写入该标头,因此您可能最终得到一个具有以下内容的日志文件:

Your File Header ...
11:11:59.589 [main] INFO  o.g.sandbox.logback.LogbackTest - hello!
Your File Header ...
11:12:12.352 [main] INFO  o.g.sandbox.logback.LogbackTest - hello!
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,您可以编写自己的Layout或Appender。这是一个简单的扩展示例FileAppender

public class FileAppenderWithHeader extends FileAppender {

    private String header;

    public String getHeader() {
        return header;
    }

    public void setHeader(String header) {
        this.header = header;
    }

    @Override
    public void openFile(String fileName) throws IOException {
        super.openFile(fileName);
        File activeFile = new File(getFile());
        if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) {
            write((header + "\n").getBytes());
        }
    }

    private void write(byte[] byteArray) throws IOException {
        if (byteArray == null || byteArray.length == 0)
            return;

        lock.lock();
        try {
            super.getOutputStream().write(byteArray);
            if (super.isImmediateFlush()) {
                super.getOutputStream().flush();
            }
        } finally {
            lock.unlock();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以这样配置:

<appender name="FILE" class="org.glytching.sandbox.logging.FileAppenderWithHeader">
    <file>target/test.log</file>
    <header>Your File Header ...</header>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)

并且此附加程序创建的每个文件都将从此行开始(无论附加程序启动/停止了多少次):

Your File Header ...
Run Code Online (Sandbox Code Playgroud)