如何使用有效的json格式的Serilog记录复杂对象?

时间:2016-09-28 13:49:08

标签: c# json serilog structured-data

我有这个结构:

public class LogRequestParameters
{
    public string RequestID { get; set; }

    public string Type { get; set; }

    public string Level { get; set; }

    public string DateTime { get; set; }

    public string MachineName { get; set; }

    public Request Request { get; set; }
}

public class Request
{
    public string URLVerb { get; set; }
}

我正在编写以下日志记录:

Serilog.Log.Information("{@LogRequestParameters}", logRequestParameters);

我得到以下输出:

LogRequestParameters { RequestID: "bf14ff78-d553-4749-b2ac-0e5c333e4fce", Type: "Request", Level: "Debug", DateTime: "9/28/2016 3:12:27 PM", MachineName: "DXBKUSHAL", Request: Request { URLVerb: "GET /Violation/UnpaidViolationsSummary" } }

这不是一个有效的json。 “LogRequestParameters”(类的名称)即将开始。 “请求”(财产的名称)将要两次。 如何记录有效的json?

2 个答案:

答案 0 :(得分:5)

假设您正在使用文件,滚动文件或控制台接收器,则需要指定JsonFormatter

Log.Logger = new LoggerConfiguration()
    .WriteTo.RollingFile(new JsonFormatter(), "myapp-{Date}.json")
    .CreateLogger();

Serilog支持一些不同的JSON格式;有关替代方案的讨论,请参阅this post

答案 1 :(得分:2)

确保您的消息模板的末尾包含:lj 格式说明符

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console(outputTemplate:
        "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")
    .CreateLogger();

来自documentation

Message-日志事件的消息,以纯文本形式呈现。 :l格式说明符切换字符串引用,而:j对所有嵌入式结构化数据使用JSON样式呈现。

在带有json示例的前文档页面上没有提及它,我也花了很多时间来解决这个问题