0

私はカスタムロガーを持って、私は私のカスタムロガーにプロパティを設定し、メッセージをログに記録する際に、そのコンテキストをログに記録することができますコントローラのILoggerからカスタムILogger実装を取得するにはどうすればよいですか?

SetContext(uniqueKey, object) 

と呼ばれる拡張メソッドを作成したいと思います。

ので、コードはこの

_logger 
    .SetContext(User.Email(), User) 
      .LogError(1, new Exception("foo foo foo"), "bleep Bloop"); 

ようになり、私が直面しているように見える問題はILoggerですが、私のコントローラでDIを介して返され、私の拡張メソッドで使用される順番に実際に私の習慣ではないということですILoggerの実装。

public static ILogger SetContext(this ILogger logger, string uniqueUserIdentifier, object context) 
    { 
     var redisPublisherLogger = logger as RedisPublisherLogger; 

     if (redisPublisherLogger == null) 
     { 
      return logger; 
     } 

     redisPublisherLogger.Context = new LoggingContext 
     { 
      ContextData = context, 
      UniqueUserIdentifier = uniqueUserIdentifier 
     }; 

     return logger; 
    } 

とにかく私はILoggerです上のすべてのログメソッドをオーバーライド避けるためにしようとしている、このような何かをやって行くことができますがあります。

助けていただけたら幸いです! おかげ

答えて

0

はあなたの質問への部分的な答えを持っている...

DIは、それが登録されているすべてのロガーのアグリゲータである、あなたにMicrosoft.Extensions.Logging.Loggerインスタンスを返します。あなたは、実装を確認した場合、あなたはそれがそれらのロガーオーバー

public LoggerInformation[] Loggers { get; set; } 

、それLog方法の反復を持っており、個別に呼び出すことがわかります。あなたのRedisPublisherLoggerインスタンスはその配列内の項目です。このLoggerクラスは内部クラスであり、​​インターフェイスはそのプロパティを公開しないため、問題はここから始まります。

+0

感謝していたが、それは内部にあるので、私はそれを使用することはできません。私は、BeginScopeを使って、ログにコンテキストを追加するので忙しいです。 – Lyon

0

のでBeginScopeは https://nblumhardt.com/2016/11/ilogger-beginscope/

...あなたは... このリンクは非常にうまくそれを説明するログのコンテキストを提供することができますが、私がやった例があった。

public static ILogger SetContext(this ILogger logger, string uniqueUserIdentifier, object context) 
    { 
     var scope = logger.BeginScope(new LoggingContext 
     { 
      ContextData = context, 
      UniqueUserIdentifier = uniqueUserIdentifier 
     }); 

     scope.Dispose(); 

     return logger; 
    } 

と私のILoggerの実装では、私は作成しました:

private string _loggingContext; 

と私はこれを行った:01

public IDisposable BeginScope<TState>(TState state) 
    { 
     var s = state as IDisposable; 

     _loggingContext = JsonConvert.SerializeObject(s); 

     return s; 
    } 
は、今私は私がいることを通告をした、利用可能な私の特定のコンテキストデータ...