журнал JSON с помощью serilog

Я хотел бы регистрировать любой 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 свойства, то есть по 1 свойству для каждого свойства json, без необходимости определять шаблон сообщения. Это возможно? мне нужно реализовать свой собственный JsonFormatter?


person Gabriel Bursztyn    schedule 03.01.2017    source источник
comment
Следует отметить, что JSON по определению является строковым форматом обмена. Нет концепции JSON как строки по сравнению с объектом ...   -  person War10ck    schedule 03.01.2017
comment
спасибо за Ваш ответ. У меня есть репозиторий журналов, и я хотел бы искать по свойству, поэтому с шаблоном сообщения я бы заранее определил все свои свойства. Это основная причина, по которой я спрашиваю об этом.   -  person Gabriel Bursztyn    schedule 03.01.2017
comment
У вас JSON как JSON.NET JObject? Если да, то github.com/destructurama/json-net должно быть тем, что вам нужно. .   -  person Nicholas Blumhardt    schedule 04.01.2017


Ответы (2)


Вы должны настроить свой регистратор для использования Json.JsonFormatter и просто передать объект при регистрации информации, Serilog сериализует объект.

Конфигурация

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

Я использовал в log4net для отправки на Seq. Итак, при отправке сообщения я добавил в threadContext свойство для каждого JProperty в Json только на первом уровне. Теперь в 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();
        }
person Gabriel Bursztyn    schedule 03.01.2017