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

时间:2018-10-29 22:47:15

标签: c# logging log4net

我们可以使用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": ""
            }
}

_index,_typem _id,_version是常量。 _source数据来自实际的日志字段。

我们该怎么做?有任何想法吗?我在想一种方法来构建整个字符串,然后输出字符串。我认为,但这应该有更好的方法。

谢谢

1 个答案:

答案 0 :(得分:1)

我们已经做了一段时间了,可以使用动态对象来完成。我们有不同的日志事件类型,它们是集中式的,这使得可以灵活地添加所需的任何信息。 loggingEvent事件对象来自log4net,并且在自定义附加程序中有一个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);