依存性注入でlog4netを使用する方法 質問する

依存性注入でlog4netを使用する方法 質問する

私は依存性注入フレームワークを使用した log4net の適切なパターンと使用法が何であるかを理解しようとしています。

Log4NetはILogインターフェースを使用しますが、

LogManager.GetLogger(Reflection.MethodBase.GetCurrentMethod().DeclaringType)

情報をログに記録する必要がある各クラスまたはメソッドで、これは IoC の原則に反しているように思われ、Log4Net の使用を余儀なくされます。

どこかに別の抽象化レイヤーを追加する必要がありますか?

また、現在のユーザー名などのカスタム プロパティを次のようにログに記録する必要があります。

log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName;

これをカプセル化して、毎回実行することを覚えておく必要がなくなり、ログに記録する現在の方法を維持するにはどうすればよいですか。このようなことをすべきでしょうか、それとも完全に的を外しているのでしょうか?

public static class Logger
{
    public static void LogException(Type declaringType, string message, Exception ex)
    {
        log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName;
        ILog log = LogManager.GetLogger(declaringType);
        log.Error(message, ex);
    }
}

ベストアンサー1

ここでは、木を見て森を見ていないと思います。ILog と LogManager は、Apache commons-logging とほぼ 1:1 で同等の軽量ファサードであり、実際にはコードを log4net の残りの部分と結合しません。

<rant>
私はまた、ほとんどいつも誰かが log4net の周りで MyCompanyLogger ラッパーを作成すると、そのポイントは大きく外れ、フレームワークの重要で便利な機能を失ったり、便利な情報を捨てたり、簡素化された ILog インターフェイスを使用しても可能なパフォーマンスの向上を失ったり、あるいはそのすべてが起こることになります。言い換えれば、log4netとの結合を避けるためにlog4netをラップするのはアンチパターンである
</rant>

注入する必要があると思われる場合は、注入を有効にするプロパティを介してロガー インスタンスにアクセスできるようにし、従来の方法で既定のインスタンスを作成します。

すべてのログ メッセージにコンテキスト状態を含めるには、ToString()探しているものを解決するグローバル プロパティを追加する必要があります。例として、現在のヒープ サイズの場合:

public class TotalMemoryProperty
{
    public override string ToString()
    {
        return GC.GetTotalMemory(false).ToString();
    }
}

次に、起動時に接続します。

GlobalContext.Properties["TotalMemory"] = new TotalMemoryProperty();

おすすめ記事