1

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

创建了这个类:

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. 在我的日志文件中,标题显示了两次。似乎它尝试创建文件两次或类似的东西,因为如果我在文件名上使用时间戳,那么我创建了 2 个文件。

  2. 如果我停止应用程序并重新启动它,我的 csv 文件上会显示更多 2 个标题。

我的日志看起来像这样:

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

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

4

1 回答 1

0

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

@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;
    }

基本上,我打开文件并遍历这些行......如果我找到标题,我会返回空......

于 2016-07-28T20:22:18.520 回答