2016-07-28 43 views
1

Ich habe eine Klasse, die ich brauche, um eine CSV-Datei zu erstellen. Also, was ich bisher getan habe, war, dass:Wie füge ich einen Header in meine Log-Dateien mit Logback?

diese Klasse Erstellt:

public class MyPatternLayout extends PatternLayout { 


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

} 

Und meine logback Datei wird wie folgt konfiguriert:

<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> 

Nun, was passiert, meine genau jetzt ist:

  1. In meiner Protokolldatei wird die Kopfzeile zweimal angezeigt. Scheint, als ob er versucht, die Datei zweimal oder so ähnlich zu erstellen, denn wenn ich den Namen der Datei mit dem Zeitstempel bearbeite, habe ich 2 Dateien erstellt.

  2. Wenn ich die Anwendung stoppe und neu starte, werden mehr 2 Header in meiner CSV-Datei angezeigt.

Mein Protokoll wird wie folgt aussehen:

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 

Was muss ich tun, um dieses Problem zu beheben? Ich möchte den Header nur am Anfang jeder Datei anzeigen. Wenn ich stoppe und starte, sollte es erkennen, dass es bereits einen Header für die Datei gibt und nicht hinzufügen.

Antwort

0

Nun, ich weiß nicht, ob ich es die beste Art und Weise mache, aber dieses Problem, das ich dies gemacht zu lösen:

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

Grundsätzlich öffne ich die Datei und gehen über die Linien ... Wenn ich die Kopfzeile finde, die ich leer zurückgebe ...