使用 serilog 记录 json

log json with serilog

我想将任何 json 记录到 serilog 属性中。我已经阅读了很多关于 serilog 和 json 的内容,但它是一个结构化的 json 日志记录,带有一个消息模板。所以我不想记录这个 Log.Info("{@text}",text); 我想这样做:

var json = "{ \"text\": \"hello\" }"; //a json string or a Json object
Log.Info(json);

主要区别在于,对于第一种方法,您有一个消息模板,并且始终有一个“文本”属性。我想要 json 具有不同的结构,例如如果我有:

var json = "{ \"text\": \"hello\", \"text2\": \"hello2\" }"; //a json string or a Json object
Log.Info(json);

我想获得 2 个属性,即每个 json 属性 有 1 个 属性,而无需定义消息模板。这可能吗?我必须实现自己的 JsonFormatter 吗?

我在 log4net 中使用了一个发送到 Seq。因此,在发出消息时,我仅在第一级为 Json 中的每个 JProperty 添加了 threadContext 一个 属性。现在在 Seq 中,我可以通过 json 属性 中的任何一个进行搜索。这是一个示例(注意消息变量在调用此方法之前应该是 Json 字符串)。

private void AddProperties(string message)
        {
            var parsedObject = JObject.Parse(message);
            foreach (JProperty prop in parsedObject.Properties())
            {
                AddProperty(prop);
            }


        }
        private void AddProperty(JProperty message)
        {
            log4net.ThreadContext.Properties[message.Name] = message.Value.ToString();
        }

您必须将记录器配置为使用 Json.JsonFormatter 并在记录信息时仅传递对象,Serilog 将序列化该对象。

配置

Log.Logger = new LoggerConfiguration()
            .WriteTo.RollingFile(new JsonFormatter(), Path.Combine(@"c:\log", "[filename]-{Date}.txt"))
            .CreateLogger()