2017-05-28 5 views
3

このようなシナリオとします。このシナリオではASP.NETコアロギングを使用して遅延ログを記録する方法は?

[Route("api/test")] 
public class TestController 
{ 
    private readonly ILogger<TestController> logger; 

    public TestController(ILogger<TestController> logger) 
    { 
     this.logger = logger; 
    } 

    [HttpPut] 
    public void Put(Guid id, [FromBody]FooModel model) 
    { 
     logger.LogInformation($"Putting {id}"); 
     logger.LogTrace("Putting model {0}", Newtonsoft.Json.JsonConvert.SerializeObject(model)); 
     try 
     { 
      // Omitted: actual PUT operation. 
     } 
     catch (Exception ex) 
     { 
      logger.LogError("Exception {0}", ex); 
     } 
    } 
} 

public class FooModel 
{ 
    string Bar { get; set; } 
} 

を、LogInformation呼び出しがstring.Format呼び出しをトリガーし、さらに悪いことになり、LogTraceラインに関係なくLogLevelの、SerializeObject呼び出しをトリガーします。それはむしろ無駄に思える。

もっと怠惰なアプローチを可能にするLogging APIの場所はありますか?私が考えることができる唯一の回避策は、モデル上でToStringをオーバーライドして、非常に冗長な表現を作成し、JsonConvert.SerializeObjectをツールとしてスキップすることです。

+0

は 'IsEnabled' http://dotnetliberty.com/を使用しての記事ですindex.php/2015/11/19/asp-net-5-why-use-ilogger-isenabled/ – Svek

+0

これはあなたが探しているものではない場合でも、主なスレッドは遅れを取得するには? – Svek

+0

ああ、いいえ、記事と@ meziantouの答えは私が欲しいものだと思っていますが、私はそれがどこでも繰り返されることを防ぐ方法をまだ考えています。基本的に私は探していました。私が 'Logger.IsEnabled(...)'と 'Logger.LogTrace(...)'呼び出しを組み合わせることができるAPIのものです。 – Jeroen

答えて

5

​​インタフェースはIsEnabled方法を提供し、

if (logger.IsEnabled(LogLevel.Information)) 
{ 
    logger.LogInformation($"Putting {id}"); 
} 

if (logger.IsEnabled(LogLevel.Trace)) 
{ 
    logger.LogTrace("Putting model {0}", Newtonsoft.Json.JsonConvert.SerializeObject(model)); 
} 

あなたはGitHubの上のデフォルトの実装を見つけることができます:ここでhttps://github.com/aspnet/Logging/blob/dev/src/Microsoft.Extensions.Logging/Logger.cs#L91

関連する問題