C# 如何使用Serilog以有效的json格式记录复杂对象?
我有这样的结构:C# 如何使用Serilog以有效的json格式记录复杂对象?,c#,json,serilog,structured-data,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 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?假设您正在使用文件、滚动文件或控制台接收器,则需要指定一个
JsonFormatter
:
Log.Logger = new LoggerConfiguration()
.WriteTo.RollingFile(new JsonFormatter(), "myapp-{Date}.json")
.CreateLogger();
Serilog支持几种不同的JSON格式;请参阅,以了解一些备选方案的讨论。确保您的消息模板在末尾包含:lj格式说明符:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(outputTemplate:
"[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")
.CreateLogger();
发件人:
Message—日志事件的消息,呈现为纯文本。:l格式说明符切换字符串的引号,并且:j对任何嵌入式结构化数据使用JSON样式的呈现
在带有JSON示例的front docs页面上没有提到它,我也花了很多时间来解决这个问题。我从Newtonsoft推荐。使用JSON.NET,您可以使用
var JSON=JsonConvert.serialize(logRequestParameters)序列化对象的任何实例
@ThePerplexedOne:您不能用序列化框架替换日志框架,如果我没有弄错的话,Serilog仍然依赖于Json.NET。Serilog是一个支持结构化错误日志的日志框架。该结构的持久化方式取决于所使用的特定接收器。你能告诉我你是怎么初始化Serilog的吗?这将有助于了解您使用的是哪个接收器。@MartinLiversage不,Serilog不使用JSON.NET(除了基本的.NET Framework/Core软件包:-),我使用的是Serilog 1.5.14,无法编写上述代码。在1.5中,使用WriteTo.sink(新的RollingFileLink(“myapp-{Date}.JSON”,新的JsonFormatter(),1024L*1024*1024,31,null,false)
。如果可以的话,升级到2.x是值得的:-)不支持传递格式化程序的接收器如何,例如Seq?