2

Log4Net カスタム プロパティを使用して、環境情報をログに追加しています。プログラム クラスがコンテキスト情報 (注文 ID、ユーザー ID など) を格納するために使用するグローバル アクセス可能なプロパティとそれらの周りの遅延ラッパーを使用してユーティリティ クラスを作成したので、Log4Net ThreadContext を常に変更する必要はありません。このようなもの:

public class LoggerPropertyProvider
{
    private readonly string _value;

    public LoggerPropertyProvider(string value)
    {
        _value = value;
    }

    public override string ToString()
    {
        return _value;
    }
}

プロパティとして Log4Net に公開する値が何であれ、アプリケーションの開始時にこの遅延評価器を使用して登録するだけです。

ThreadContext.Properties["ORDER_ID"] = new LoggerPropertyProvider(ContextInformation.OrderId);

バッファレス アペンダー(ローリング ファイルなど) で、または AdoNetAppender でバッファが 0 に設定されている場合に問題なく動作します。ただし、バッファが1より大きい場合、アプリケーションの最後にバッファがフラッシュされるまで、またはバッファ内のエントリが > bufferSize になるまで、Log4Net はプロパティの評価を延期します。

これが発生すると、情報がグローバル プロパティに存在しなくなったか、値が変更された (ループ処理命令のように) ため、ログに間違った値または null 値が記録されます。

これを修正するために私が見ることができる唯一のオプションは、バッファーの使用を停止することです。これにより、エントリがフラッシュされているときにすべての呼び出しでプロパティ値が評価されます。ThreadContext のプロパティはバッファがフラッシュされているときにのみ評価されるため、ログ呼び出しごとに異なるプロパティ値を持つことはできません。

エントリをフラッシュするときではなく、バッファリングするときに Log4Net に ThreadContext (またはその他のコンテキスト) を評価させる方法はありますか?

ありがとう

4

2 に答える 2

0

プロパティをlog4netスレッドコンテキストに配置する必要があるようです:

log4net.ThreadContext.Properties["ORDER_ID"] = new LoggerPropertyProvider(ContextInformation.OrderId);

このコンテキストは、グローバル コンテキストのすべてのプロパティをオーバーライドし、log4net 自体によって管理されます。

log4net.ThreadContext

于 2014-10-28T07:48:27.743 に答える