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

use*_*538 9 c# json structured-data serilog

我有这个结构:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

Serilog.Log.Information("{@LogRequestParameters}", logRequestParameters);
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

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" } }
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*rdt 6

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

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

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


Aut*_*rii 6

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

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

文档

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

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