代码之家  ›  专栏  ›  技术社区  ›  urlreader

使用log4net生成带有自定义布局/字段的json格式日志?

  •  1
  • urlreader  · 技术社区  · 7 年前

    我们可以使用log4net生成带有自定义布局/字段的json格式日志吗?

    我在用log4net记录一些信息。现在,由于这个和那个原因,我们需要将其记录为json格式。

    我使用log4net.ext.json来实现这一点,它记录如下信息:

    {"date":"2018-10-29T15:18:26.7785983-07:00","level":"INFO","logger":"Service.Services.LogService","message":"data_length: 10"}
    {"date":"2018-10-29T15:18:26.7796462-07:00","level":"INFO","logger":"Service.Services.LogService","message":"max_parallelism: 1"}
    

    但是,由于我们会记录很多信息,我们会将此日志提供给另一个程序进行分析。所以,我们希望输出如下:

    {
      "_index": "error_201843",
      "_type": "error_web",
      "_id": "AWaytV_hi121qded",
      "_version": 1,
      "_source": {
                        "ApplicationSource": "Data Feed",
                        "ErrorType": "RequestTimeout",
                        "XStackTrace": "",
                        "ErrorMessageText": ""
                }
    }
    

    _索引,_typem_id,_version是常量。_源数据来自实际的日志字段。

    我们怎么能这样做?有什么想法吗?我想有一个方法来构建整个字符串,然后输出该字符串。但我认为它应该有更好的方法来做到这一点。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   fanuc_bob    7 年前

    我们已经这样做了一段时间,可以使用动态对象来完成。我们有不同的日志事件类型,它们是集中式的,这允许灵活地添加所需的任何信息。loggingEvent事件对象来自log4net,是自定义appender中的一个append覆盖。

    JsonSerializerSettings _jsonSerializerSettings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore };
    
    dynamic m = new System.Dynamic.ExpandoObject();
    m.SessionId = _sessionId;
    m.ProcessId = _processId.ToString();
    m.ProcessName = _processName;
    m.MachineName = _machineName;
    m.UserName = _userName;
    m.Level = loggingEvent.Level.DisplayName;
    m.Domain = loggingEvent.Domain;
    m.TimeStamp = loggingEvent.TimeStamp.ToString("yyyyMMddHHmmssfff");
    m.MessageObject = loggingEvent.MessageObject;
    if (loggingEvent.ExceptionObject != null)
    {
      m.Exception = loggingEvent.ExceptionObject.ToString();
      m.StackTrace = loggingEvent.ExceptionObject.StackTrace;
    }
    
    //Convert the object to a json string
    string msg = JsonConvert.SerializeObject(m, Formatting.None, _jsonSerializerSettings);