繁体   English   中英

使用 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 吗?

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

配置

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

我在log.net中使用了一个发送到Seq 因此,在发出消息时,我在threadContext中为 Json 中的每个JProperty添加了一个属性,仅在第一级。 现在在 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();
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM