2017-09-18 15 views
2

ログバックを使用してcsv形式でログを書き込む必要があるという要件があります。私はすべてのローリングにヘッダを追加するにはどうすればよいログバックを使ってcsv形式でログファイルを書き込むには?

Time,User,Param1,Param2 

- :私はまた、すべてのファイルで、このような標準的なヘッダーを持っている必要がありますしかし、私はちょうどその

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

を行うことができますサンプルを発見しました

+0

:アプリケーションが起動するたびに)、あなたはそうのようなgetFileHeader()をconditionaliseことができます。 – wallenborn

答えて

1

は、あなたが実装することができますファイルを自分自身のLayout

public class LogFileHeaderPatternLayout extends PatternLayout { 

    private String header; 

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

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

そして、そうのようにそれを参照する:

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> 
    <layout class="x.y.z.LogFileHeaderPatternLayout"> 
     <header>a,b,c,d</header> 
     <pattern>%msg%n</pattern> 
    </layout> 
</encoder> 

Logbackこのヘッダevey時間を加えを主張する場合は、ログ・ファイル(すなわちを開きあなたはおそらくあなたのアペンダクラスを拡張する必要がありますすべてのファイルにヘッダ行を書き込むには

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

こんにちは、これは正しく動作していますが、唯一の問題は、アプリケーションを再起動するたびにヘッダが再び追加されることです。それが起こらないようにするにはどうすればよいですか? –

+0

@KaushikChakraborty「複数のファイルヘッダー」の問題を解決するための答えを更新しました。 – glytching

+0

'alreadyContainsHeader'チェックはかなり関わっています。ライブファイルを開いてその内容を読む必要があります(最初の行はまだですが)。ファイルが存在し、空でないかどうかだけをチェックするほうがよい解決法ではないでしょうか? – vacant78

関連する問題