我们可以使用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数据来自实际的日志字段。
我们该怎么做?有任何想法吗?我在想一种方法来构建整个字符串,然后输出字符串。我认为,但这应该有更好的方法。
谢谢
答案 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);