Serilog: не удается войти в MongoDb с помощью приемника MongoDb

У меня есть локальный экземпляр базы данных MongoDb (созданный путем запуска mongod из командной строки Windows) и простая консольная программа, которая пытается записать строку в базу данных MongoDb с помощью Serilog и его приемника MongoDb:

        var log = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.ColoredConsole()
            .WriteTo.MongoDB("mongodb://localhost/mydb")
            .CreateLogger();

        log.Fatal("Fatal message");

Сообщение «Неустранимое сообщение» правильно записывается в консоль, но не в мою базу данных MongoDb.

Моя текущая база данных MongoDb - «mydb». Согласно «показать коллекции», у меня есть только коллекции system.indexes и testData, а «db.testData.find ()» ничего не дает.

Сайт Serilog говорит об использовании строки подключения «mongo: // mydb / log», но это вызывает исключение «Необработанное исключение типа 'System.FormatException' произошло в MongoDB.Driver.dll». Строка подключения, которую я использовал в своем коде, указана на сайте MongoDb по адресу http://docs.mongodb.org/manual/reference/connection-string/

Как я могу войти в MongoDb с помощью Serilog?


person user1147862    schedule 12.07.2014    source источник


Ответы (3)


Возможно, вы просто испытываете задержку буферизации по умолчанию (две секунды?) - если вы закрываете консольное приложение в Windows, оно жестко завершает работу программы, поэтому буферы не всегда могут быть сброшены. Если это так, подождите несколько секунд перед закрытием приложения.

В противном случае способ решить всю отладку приемников в Serilog - это установить SelfLog.Out:

SelfLog.Out = Console.Error;

Это напечатает все исключения, вызванные приемником, что позволит вам довольно быстро увеличить масштаб ошибки, если она там, где она есть.

person Nicholas Blumhardt    schedule 13.07.2014
comment
Спасибо, я попробую. Есть ли способ установить задержку буферизации на 0? Это значительно упростит тестирование. - person user1147862; 14.07.2014
comment
Передача period: TimeSpan.Zero должна сделать это. - person Nicholas Blumhardt; 16.07.2014
comment
(Хотя несколько миллисекунд могут быть более разумными - нулевой полностью непроверенный IIRC :)) - person Nicholas Blumhardt; 16.07.2014
comment
Где пропустить период: TimeSpan.Zero? Не могли бы вы привести пример кода? - person user1147862; 17.07.2014
comment
Спасибо. Я пробовал это с TimeSpan.Zero, который отлично работает. Хотел бы предложить либо сделать Zero по умолчанию, либо упомянуть задержку буферизации по умолчанию во вводной документации Serilog (плюс как ее выключить). - person user1147862; 22.07.2014
comment
Спасибо, я посмотрю, как мы можем сделать задержку более очевидной. Отключение этого параметра снижает производительность при частой записи в сеть. Ваше здоровье! - person Nicholas Blumhardt; 22.07.2014
comment
Пробовал TimeSpan.Zero в тесте NUnit с использованием приемника RavenDB, и он работал, но имел странный побочный эффект. Это привело к тому, что процесс nunit-agent.exe начал непрерывно использовать 80–100% ЦП после того, как тест был запущен в средстве выполнения тестов NUnit GUI. Средство выполнения тестов по-прежнему реагировало и могло либо запускать другие тесты, либо просто бездействовать, но его нужно было выключить, чтобы процесс остановил чрезмерную загрузку ЦП. Нет проблем с процессором в обозревателе тестов VS2013, и нет проблем ни в одном из них при использовании TimeSpan.FromMilliseconds (1) вместо этого. - person jk7; 02.07.2015
comment
Примечание: обновленный синтаксис для включения отладки Serilog - SelfLog.Enable (Console.Error); - person joynoele; 13.03.2019

Я взял ответы Николаса и Редвардса (спасибо вам обоим!), Провел еще несколько экспериментов и зафиксировал результаты по адресу: http://jsnlog.com/Documentation/GetStartedLogging/StructuredLogging

person user1147862    schedule 22.07.2014

Интересно, что я получал ту же ошибку, пока не переключил строку подключения на

mongodb: // myMachineName / mydb

Раньше у меня был mongo: // localhost / mydb.

Но хотя mongo vs mongodb решили проблему исключения, он не вставлял записи в mydb! Поэтому я изменил его на

.WriteTo.MongoDB ("mongodb: // localhost / logs", limitedToMinimumLevel: LogEventLevel.Verbose)

и теперь он работает! «журналы» были созданы с «журналом» в качестве коллекции, содержащей данные JSON.

person redwards510    schedule 16.07.2014