Serilog是记录类型而不是对象内容

时间:2017-10-05 10:52:38

标签: c# logging serilog

我是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>

我哪里出错了?

2 个答案:

答案 0 :(得分:5)

这里是Serilog documentation

  

对于此任务,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);
}
相关问题