私は依存性注入フレームワークを使用した 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();