我有这个结构:
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?
答案 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();
Message-日志事件的消息,以纯文本形式呈现。 :l格式说明符切换字符串引用,而:j对所有嵌入式结构化数据使用JSON样式呈现。
在带有json示例的前文档页面上没有提及它,我也花了很多时间来解决这个问题