如何使用 logback 在我的日志文件中添加 header?

How to add a header on my log files using logback?

我有一个 class 需要创建一个 csv 文件。 所以到目前为止我所做的是:

创建此 class:

public class MyPatternLayout extends PatternLayout {


    @Override
    public String getFileHeader() {
            return "message id, file name, start time, end time, status";
    }

}

我的logback文件是这样配置的:

    <appender name="METRICSTEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>metricstest.csv</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>metricstest-%d{yyyy-ww}.csv.zip</fileNamePattern>
            </rollingPolicy>
            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <layout class="com.mdw360.actuator.log.layout.MyPatternLayout">
                    <pattern>%msg%n</pattern>
                </layout>
            </encoder>
        </appender>
<logger name="com.mdw360.actuator.tasks.MetricsLoggingTask" level="INFO" additivity="false">
        <appender-ref ref="METRICSTEST" />
    </logger>

嗯,我现在的情况是:

  1. 在我的日志文件中,header 显示了两次。似乎它试图创建文件两次或类似的东西,因为如果我在文件名上使用时间戳而不是我创建了 2 个文件。

  2. 如果我停止应用程序并再次启动它,我的 csv 文件中会显示更多 2 headers。

我的日志是这样的:

message id, file name, start time, end time, status
message id, file name, start time, end time, status
First Line
Second Line
Stop Application
message id, file name, start time, end time, status
message id, file name, start time, end time, status
First Line
Second Line
Stop Application

我需要做什么来解决这个问题?我只想在每个文件的开头显示 header 。如果我停止并启动它应该确定文件上已经有一个 header 并且不要添加它。

好吧,不知道我这样做是否最好,但为了解决这个问题,我做了这个:

@Override
    public String getFileHeader(){
        boolean constainsHeader = false;
        try {
            BufferedReader br = new BufferedReader(new FileReader(filePath));
            String line = null;
            while ((line = br.readLine()) != null && !constainsHeader) {
                if(line.contains(header)){
                    constainsHeader = true;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        if(constainsHeader){
            return "";
        }
        return header;
    }

基本上,我打开文件并检查行...如果我发现 header 我 return 是空的...