我是Serilog的新手 - 尝试一下,看看它是否会有所帮助。我正在使用Serilog v2和Serilog.Sinks.MsSqlServer v5
我有以下控制台应用代码:
static void Main(string[] args)
{
var logger = CreateLogger();
var employee = new Person()
{
Name = "Rob",
Age = 45
};
logger.Debug("Employee details {Employee}", employee);
Console.ReadKey();
}
private static ILogger CreateLogger()
{
string levelString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
"LCC.Common", "Serilog.MinimumLevel");
SerilogLevel level = (SerilogLevel)Enum.Parse(typeof(SerilogLevel), levelString);
string conString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
"LCC.Common", "Serilog.ConnectionString");
var levelSwitch = new LoggingLevelSwitch();
levelSwitch.MinimumLevel = (Serilog.Events.LogEventLevel)level;
return new LoggerConfiguration()
.MinimumLevel.ControlledBy(levelSwitch)
.WriteTo.MSSqlServer(connectionString: conString, tableName: "Logs", autoCreateSqlTable: true)
.CreateLogger();
}
我原本希望记录Person的详细信息,即Name Rob和Age 45.但是,我发现以下内容已登录到我的Sql Server Sink上的Properties列:
<properties><property key='Employee'>ConsoleApplication1.Person</property></properties>
我哪里出错了?
答案 0 :(得分:5)
对于此任务,Serilog提供@deconstruction运算符。
logger.Debug("Employee details {Employee}", employee);
正如您可以看到要进行解构,您必须在键名前设置@。您的示例代码
中遗漏了这个内容W
答案 1 :(得分:0)
日志记录框架将在传递给它的对象上调用ToString。如果要记录详细信息,一个选项是覆盖ToString方法以序列化对象(假设引用Newtonsoft.JSON库):
// in Person.cs
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}