アプリケーションで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列内にレンダリングすることもできますか?後でアプリケーションのログビューアの詳細ビューに出力したいと思います。
私は基本的にオブジェクトの破壊に似た動作を探していますが、ログメッセージの一部としてフラットオブジェクトを出力していません。
これは次のように簡単です。
Log.ForContext("BirthDate", person.BirthDate)
.Information("New user: {FirstName:l} {LastName:l}",
person.FirstName, person.LastName);
実際には、いくつかの異なる方法でこれを行うことができます。あなたの場合、最初の方法がおそらく最良です:
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)の構造化ロギングの概念 を参照してください。