2016-05-26 13 views
1

Log4netで素晴らしいログ抽象化を試みるために、this SO postとアダプタをthis SO postから抽象化し、それらを連携させようとしました。Log4netを使った単純なインジェクタと抽象抽象

本当に残っていたのは、コンテナを構成することでした。これは、私が成功しなかった部分です。私が試してみました

設定を使用すると、コードから見ることができるように、私はそれが注入されたクラスからその型をとり、特定のlog4netのロガーを希望

public static class InfrastructureRegistry 
{ 
    public static void RegisterLoggingServices(this Container container) 
    { 
     container.RegisterConditional(typeof(ILog), c => LogManager.GetLogger(
      c.Consumer.ImplementationType).GetType(), 
      Lifestyle.Scoped, c => true); 
     container.RegisterPerWebRequest<ILogger, Log4netAdapter>(); 
    } 
} 

です。ほとんどのロギングはキャッチオールで行われますが、いくつかのロギングは下位層で行われることが望まれます。フォームの検証に失敗したとき

私はその構成で取得ActivationExceptionは次のとおりです。

タイプLogImplのコンストラクタは、名前 「ロガー」と登録されていないタイプのILoggerですとパラメータが含まれています。 ILoggerが登録されていることを確認するか、LogImplのコンストラクタを変更してください。

ここからどこに行くのかはわかりません。だから、どんな助けにも感謝します。

編集

申し訳ありませんが、私はそのような私は一度だけ、この設定を記述する必要があること記述しようとしていますことを指摘しなければなりません。以下のファクトリ関数は動作しますが、私は手動で私はロガーを注入するたびに多くの設定を追加する必要がありますする必要はありません:

container.RegisterPerWebRequest<ILog>(() => LogManager.GetLogger(typeof(LoginController))); 

答えて

3

あなたがを指すexample adapterは、アプリケーション内のすべてのコンポーネントのための単一のロガーを前提としていあなたが望むのは、その消費者を「知っている」特定のロガーを持つことです。そのため、ログメッセージを元のクラスに関連付けることができます。

これはlog4netやNLogのようなツールを使って作業しているときのように見えますが、私の経験では、この要件は多くの場合、コードのあまりにも多くの場所でロギングが行われていることが原因です。詳細については、this stackoverflow q/aをお読みください。

つまり、条件付きでロガーを登録する場合は、アダプターを汎用クラスに変更する必要があります。あなたが条件付きの登録を行うことができる方法:このジェネリッククラスで

public class Log4netAdapter<T> : ILogger 
{ 
    private static readonly log4net.ILog logger = LogManager.GetLogger(typeof(T)); 

    public void Log(LogEntry entry) 
    { 
     if(entry.LoggingEventType == LoggingEventType.Information) 
      logger.Info(entry.Message, entry.Exception); 
     else if(entry.LoggingEventType == LoggingEventType.Warning) 
      logger.Warn(entry.Message, entry.Exception); 
     else if(entry.LoggingEventType == LoggingEventType.Error) 
      logger.Error(entry.Message, entry.Exception); 
     else 
      logger.Fatal(entry.Message, entry.Exception); 
    } 
} 

は、あなたは以下の条件/コンテキスト登録を行うことができます。

container.RegisterConditional(
    typeof(ILogger), 
    c => typeof(Log4netAdapter<>).MakeGenericType(c.Consumer.ImplementationType), 
    Lifestyle.Singleton, 
    c => true); 
+1

おかげでスティーブンのヒープ。私は自分自身に迷惑をかける。あなたの答えはとても分かりやすいように見えますが、どうして私がそれを思い付かなかったのか分かりません。私は年を過ごしました。再度、感謝します! – onefootswill

関連する問題