web-dev-qa-db-ja.com

Serilogにカスタムプロパティを追加する

アプリケーションでMSSQLServerシンクを備えたSerilogを使用しています。次のクラスを定義したとしましょう...

public class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }

  public DateTime BirthDate { get; set; }
  // ... more properties
}

...そしてインスタンスを作成しました:

var person = new Person
{
    FirstName = "John",
    LastName = "Doe",
    BirthDate = DateTime.UtcNow.AddYears(-25)
};

コードに次のログ呼び出しを配置し​​ました。

Log.Information("New user: {FirstName:l} {LastName:l}",
    person.FirstName, person.LastName);

BirthDateプロパティメッセージテンプレートに追加せずにをログに記録して、Properties XML列内にレンダリングすることもできますか?後でアプリケーションのログビューアの詳細ビューに出力したいと思います。

私は基本的にオブジェクトの破壊に似た動作を探していますが、ログメッセージの一部としてフラットオブジェクトを出力していません。

16
Marius Schulz

これは次のように簡単です。

Log.ForContext("BirthDate", person.BirthDate)
   .Information("New user: {FirstName:l} {LastName:l}",
                           person.FirstName, person.LastName);
23

実際には、いくつかの異なる方法でこれを行うことができます。あなたの場合、最初の方法がおそらく最良です:

Log.ForContext("BirthDate", person.BirthDate)
    .Information("New user: {FirstName:l} {LastName:l}",
        person.FirstName, person.LastName);

ただし、他のシナリオでLogContextを使用することもできます。

Log.Logger = new LoggerConfiguration()
    // Enrich all log entries with properties from LogContext
    .Enrich.FromLogContext();

using (LogContext.PushProperty("BirthDate", person.BirthDate))
{
    Log.Information("New user: {FirstName:l} {LastName:l}",
        person.FirstName, person.LastName);
}

または、「定数」プロパティをログに記録する場合は、次のように追加できます。

Log.Logger = new LoggerConfiguration()
    // Enrich all log entries with property
    .Enrich.WithProperty("Application", "My Application");

詳細については、 コンテキストと相関– .NET(5)の構造化ロギングの概念 を参照してください。

3