2012-11-08 5 views
8

必要な機能は、という構成のログファイルの先頭にヘッダー行を書き込むことです。さらに、ログファイルは、は、時間パターンに基づいてにロールオーバーする必要があります(私はログバック1.0.7を話しています)。カスタムログバックアペンダー - ファイルヘッダーの前にロールオーバーを作成する

だから、私はアペンダを書くと思っています - 私はそれは私が実際に必要とするカスタムレイアウトではないのかどうかわからないが。 logbackのマニュアルパー

1)アペンダ

、正しいアプローチはAppenderSkeletonを拡張することですが、その後どのように私は、ファイルのロールオーバーを作成するRollingFileAppender(と組み合わせるでしょうか?)

他に私がRollingFileAppenderを拡張した場合、既存の機能を装飾するためにどのようなメソッドをオーバーライドするのですか?特定のStringをファイルの先頭に書き込むように指示するにはどうすればよいですか?

2)レイアウト

同様に、アプローチはLayoutBaseを拡張し、doLayout(ILoggingEvent event)の実装を提供しているように見えます。 しかし、(私はまだ残りのログを適切に表示したいので)機能を混乱させるのではなく、ファイルに新しい行を追加するだけで、動作を飾る方法はわかりません。

getFileHeader()LayoutBaseは有望ですが、どうすれば使用できますか?カスタムレイアウトによって上書きされることさえ意図されていますか? (おそらくはい、それはレイアウトインターフェイスの一部ですが、それでどうですか?)

ありがとう!

答えて

10

私は自分の質問に答えています。他の誰かが同じ問題を抱えている場合に備えてです。

AppenderSkeletonを拡張するのではなく、ロールオーバー機能を維持するためにRollingFileAppenderを拡張し、openFile()メソッドをオーバーライドしました。これは私が最終的に行った方法です(正統であればわかりません)。ここでは、ログファイルを操作し、その中にヘッダを書き込むことができます。このように:<header> value </header>

public void openFile(String fileName) throws IOException { 
     super.openFile(fileName); 
     File activeFile = new File(getFile()); 
     if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) { 
      FileUtils.writeStringToFile(activeFile, header); 
     } 
    } 

私はこのような単純なlogback.xmlのヘッダを、構成しました。これは、それを私の新しいアペンダーのヘッダーフィールドに挿入します。

問題なく動作するようですが、より良い方法を知っていれば投稿してください!

+0

@teoを知っていますか? – Mihir

4

解決策に問題があります:新しいファイルごとのログの最初の行が削除されます。私は、ファイルがログバックによって開かれているのに対し、ヘッダーを書き込むためだと思います。 は、私はこの問題を持っていない別の解決策を見つけた:あなたは私たちがどんなカスタムのAppenderクラスのstartメソッドでlogback.xmlで定義されたカスタムプロパティを取得する方法

public void openFile(String fileName) throws IOException 
{ 
    super.openFile(fileName); 
    File activeFile = new File(getFile()); 
    if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) 
    { 
     lock.lock(); 
     try 
     { 
      new PrintWriter(new OutputStreamWriter(getOutputStream(), StandardCharsets.UTF_8), true).println("your header"); 
     } 
     finally 
     { 
      lock.unlock(); 
     } 
    } 
}