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

Serilog is logging type rather than object content

我是 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();
    }

我本来希望记录人员的详细信息,即姓名 Rob 和年龄 45。但是,我发现以下内容记录到我的 Sql Server Sink 的 Properties 列中:

<properties><property key='Employee'>ConsoleApplication1.Person</property></properties>

我哪里错了?

日志框架将对传递给它的对象调用 ToString。如果您想要记录详细信息,一种选择是覆盖 ToString 方法以序列化对象(假设引用 Newtonsoft.JSON 库):

// in Person.cs
public override string ToString()
{
    return JsonConvert.SerializeObject(this);
}

这里是Serilog documentation

For this task, Serilog provides the @ destructuring operator.

var sensorInput = new { Latitude = 25, Longitude = 134 };
Log.Information("Processing {@SensorInput}", sensorInput);

如您所见,要进行解构,您必须在键名前设置@。这在您的示例代码中遗漏了

logger.Debug("Employee details {Employee}", employee);