Использовать Log4net для создания журнала формата JSON с пользовательским макетом / полями? - PullRequest
0 голосов
/ 30 октября 2018

можно ли использовать 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 являются постоянными. Исходные данные поступают из фактических полей журнала.

Как мы можем это сделать? Есть идеи? Я думаю, есть метод, чтобы построить всю строку, а затем вывести строку. Думаю, у него должен быть лучший способ сделать это.

Спасибо

1 Ответ

0 голосов
/ 31 октября 2018

Мы занимаемся этим уже некоторое время, и это можно сделать с помощью динамического объекта. У нас есть различные типы событий журнала, которые централизованы, и это позволяет гибко добавлять любую необходимую информацию. Объект события loggingEvent - из log4net и переопределения «Добавить» в пользовательском приложении.

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);
...