Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Serilog以有效的json格式记录复杂对象?_C#_Json_Serilog_Structured Data - Fatal编程技术网

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?