【问题标题】:log json with serilog使用 serilog 记录 json
【发布时间】:2017-01-03 17:30:29
【问题描述】:

我想将任何 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 吗?

【问题讨论】:

  • 需要注意的是,definition 的 JSON 是一种基于字符串的交换格式。没有 JSON 作为字符串与对象的概念......
  • 感谢您的回答。我有一个日志存储库,我想按属性搜索,所以使用消息模板我会提前定义我的所有属性。这就是我问这个的主要原因。
  • 您有 JSON 作为 JSON.NET JObject 吗?如果是这样,github.com/destructurama/json-net 应该是你所追求的。

标签: .net json seq serilog


【解决方案1】:

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

配置

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

【讨论】:

    【解决方案2】:

    我已经使用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();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      相关资源
      最近更新 更多