8

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

だから、私はアペンダーを書くことを考えています-それが私が実際に必要とするカスタムレイアウトではないかどうかはわかりませんが。

1)アペンダー

logbackのドキュメントによると、正しいアプローチは拡張することですが、これを(ファイルのロールオーバーを行うために)AppenderSkeletonどのように組み合わせるのでしょうか?RollingFileAppender

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

2)レイアウト

同様に、このアプローチはを拡張LayoutBaseし、の実装を提供しているようですdoLayout(ILoggingEvent event)。しかし、繰り返しになりますが、動作を装飾する方法がわかりません。ファイルの機能を中断するのではなく、ファイルに新しい行を追加するだけです(残りのログを正しく表示したいため)。

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

ありがとうございました!

4

2 に答える 2

11

他の誰かが同じ問題に遭遇した場合に備えて、ここで私は自分の質問に答えています。これは私が最終的にそれをした方法です(しかし、それが正統的な方法であるかどうかはわかりません):

AppenderSkeletonを拡張する代わりに、RollingFileAppenderを拡張して(ロールオーバー機能を維持するため)、openFile()メソッドをオーバーライドしました。ここでは、デフォルトで必要なことをすべて実行させた後、ログファイルを操作してヘッダーを書き込むことができます。このような:

 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でヘッダーを構成しました。これは、次のように簡単です<header> value </header>。これにより、新しいアペンダーのヘッダーフィールドに挿入されます。

問題なく動作しているようですが、もっと良い方法を知っている場合は投稿してください!

于 2012-11-17T00:08:57.953 に答える
5

ソリューションに問題があります。新しいファイルごとにログの最初の行が削除されます。これは、ファイルがログバックによって開かれているのに対し、ヘッダーを書き込んでいるためだと思います。私はこの問題がない別の解決策を見つけました:

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();
        }
    }
}
于 2015-02-19T20:10:59.747 に答える