2017-07-19 7 views
1

ASP.NET Core WEB APIからカスタムロガーを開発する必要があります。ログレコードはすぐ先のメディアに書き込むべきではありませんので、私は標準のロギングインフラストラクチャを使用したい は、しかし、私は必要なものを、少し異なっているが、私はASP.NET COREカスタムロガーは、リクエストごとに1回データベースに保存します。

  1. が要求ごとに新しいロガーを作成する必要がありますメモリ
  2. で、この要求の
  3. コレクトログレコードは、そのアクションまたはときに例外が表示されるの終わりにデータベースに1つのレコードとして要求のすべてのレコードを保存します。
  4. (ILoggerですを実装し、内部のStringBuilder + 1つの追加方法保存にレコードを保存)私はASP.NETコアに非常に新しいですので、私はDBLoggerを作成し、いくつかのチュートリアルに従っ

、コンフィギュレーション、プロバイダ、拡張子、私が登録それはスタートアップで動作しますが、データベースへの保存である最後のステップはありません。それはこの

public class ValuesController : Controller 

{ 
    private readonly ILogger<ValuesController> _logger; 

    public ValuesController(ILogger<ValuesController> logger) 
    { 
     _logger = logger; 
    } 

    [HttpGet] 
    public IEnumerable<string> Get() 
    { 
     _logger.LogWarning("TestWarning"); 
     _logger.LogInformation("TestInfo"); 

     return new string[] { "value1", "value2" }; 
    } 

のように見えるように、コントローラで は、私は、ロガーを取得するためにDIを使っだから私は今、ログ・レコードを書き込むことができますが、どのように私は(特定のロガーの追加(カスタム)機能を呼び出すことができますこの場合、私のDBLoggerのSave()メソッド)?私のコントローラの_loggerプロパティは、アプリケーションで内部的に使用されるすべてのロガーへの参照を保持しますが、コードからコレクションにアクセスすることはできません。

この質問は、一般的に次のようなものでもあります。カスタムILoggerのカスタム機能をコードでどのように使用することができますか。または、カスタムロガーへの参照を取得するにはどうすればよいですか?

[編集] これは私がDIによって受け取るものを、私のタイプ(DBlogger)ではありませんが、私は含ん型Microsoft.Extensions.Logging.Loggerの非公有財産_loggerを含む、Microsoft.Extensions.Logging.Loggerを取得私のロガーを含むロガーの非公開のコレクション(写真を参照)。しかし、あなたがする必要がある。この場合

private readonly dynamic _logger; 

を:だから、私はそれを感謝

フィリップ

答えて

0

1]

を複雑に感じ、なぜあなたはダイナミックとしてあなたロガーを宣言する可能性がどちらかですILoggerの特定の実装に、その呼び出しを行うときにSaveというメソッドがあることを確認してください。

または

saveを使用してsaveメソッドを呼び出します。特定のILogger実装にSaveというメソッドが含まれていない場合は、これをtryキャッチで囲み、ケースを処理します。

+0

してくださいにどんなのparamsを渡します。私はILOggerで自分のタイプを取得しませんが、私は非公開のアクセスでより複雑な構造になります。提案したアプローチをどのように使用できますか? –

1

//はILoggerですための拡張メソッドの保存を書くと私の編集を参照してください、StateInfo

public static void Save(this ILogger logger, string param) { 

var state = new List<KeyValuePair<string, dynamic>> 
{ 
    new KeyValuePair<string, dynamic>("Myparam", param), 

}; 

logger.Log(level,999, state, null, null); 
} 

public class DBLogger:ILogger{ 
public void Log<TState>(LogLevel logLevel, Microsoft.Extensions.Logging.EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) 
{ 
     if (eventId.Id == 999) //Save Event 
     { 
      if (state is IReadOnlyList<KeyValuePair<string, object>> stateInfo) 
      { 
       foreach (var property in stateInfo) 
       { 
        if (property.Key == "Myparam") 
         { 
          var value = (string)property.Value;//do something with value 
         } 
       } 
      } 
    } 
} 
関連する問題