2017-09-18 1 views
2

Ich habe eine Anforderung, wo ich ein Protokoll in einem CSV-Format mit Logback schreiben muss. Ich habe eine Probe gefunden, wo ich tun kann, nur dassWie schreibe ich Logfile im CSV-Format mit Logback?

<appender name="csv" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>mylog.csv</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 
    <!-- rollover daily --> 
    <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.csv</fileNamePattern> 
     <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --> 
     <maxFileSize>100MB</maxFileSize>  
     <maxHistory>60</maxHistory> 
     <totalSizeCap>20GB</totalSizeCap> 
     </rollingPolicy> 
     <encoder> 
     <pattern>%msg%n</pattern> 
     </encoder> 
    </appender> 

Allerdings muß ich auch so in jeder Datei ein Standard-Header haben: -

Time,User,Param1,Param2 

Wie kann ich den Header in jedem Roll hinzufügen Datei

+0

Um eine Kopfzeile zu schreiben in jede Datei, werden Sie wahrscheinlich Ihre appender Klasse erweitern müssen. – wallenborn

Antwort

1

Sie können Ihre eigenen implementieren Layout:

public class LogFileHeaderPatternLayout extends PatternLayout { 

    private String header; 

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

    @Override 
    public String getFileHeader() { 
     return header; 
    } 
} 

Und dann referenzieren Sie es wie folgt:

Wenn Logback darauf besteht, diesen Header jedes Mal hinzuzufügen, wird die Protokolldatei geöffnet jedes Mal, wenn die Anwendung gestartet wird), dann könnten Sie getFileHeader() wie so conditionalise:

public String getFileHeader() { 
    if (alreadyContainsHeader()) { 
     return ""; 
    } else { 
     return header; 
    } 
} 

private boolean alreadyContainsHeader() { 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(filePath)); 
     String line = null; 
     while ((line = br.readLine()) != null) { 
      if (line.contains(header)) { 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(System.err); 
     return false; 
    } 
} 
+0

Hallo, das funktioniert richtig, aber das einzige Problem ist, wenn ich die Anwendung neu starte, wird der Header erneut angehängt. Wie stelle ich sicher, dass es nicht passiert? –

+0

@KaushikChakraborty Ich habe die Antwort aktualisiert, um eine Lösung für das Problem "Mehrere Dateiköpfe" anzubieten. – glytching

+0

Die Prüfung 'alreadyContainsHeader' ist ziemlich kompliziert, da eine Live-Datei geöffnet und der Inhalt gelesen werden muss (erste Zeile, aber immer noch). Wäre es nicht besser, nur zu prüfen, ob die Datei existiert und nicht leer ist? – vacant78