MongoDB & Serilog

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:36, 23 сентября 2018.
MongoDB
MongoDB-Logo.svg
Разработчики: MongoDB Inc.
Выпущена: February 2009, 11 (11-02-2009) [1]
Постоянный выпуск: 3.4.9[2] / 11 September 2017 года; 4 years ago (2017-09-11)
Предыдущий выпуск: 3.5.12[3] / 22 August 2017 года; 4 years ago (2017-08-22)
Состояние разработки: Активное
Написана на: C++, C и JavaScript
Веб-сайт mongodb.org


MongoDB (от humongous) — кроссплатформенная документо-ориентированная система управления базами данных. Классифицированная как база данных NoSQL, MongoDB отходит от традиционных основ реляционной структуры базы данных в пользу JSON-подобных документов с динамическими схемами (MongoDB называет этот формат BSON), что делает интеграцию данных в определенных видах приложений проще и быстрее. Выпущено под комбинацией GNU Affero General Public License и лицензией Apache, MongoDB является бесплатным программным обеспечением с открытым исходным кодом.

Serilog — одна из удобных библиотек .NET, которая поддерживает структурное логирование. Библиотека поддерживает все основные функции логирования, которые есть у log4net, Nlog, и других известных библиотек. Serilog предоставляет возможность удобного логирования для языка C#. В статье продемонстрирована удобная возможность записи в лог объектов вроде словаря или списка без явных преобразований к строкам.

Работа свзяки MongoDB и Serilog

Для работы связки MongoDB и Serilog необходимо выполнить следующее:

  1. Развернуть и сконфигурировать СУБД MongoDB;
  2. Настроить сеть таким образом, чтобы C# приложение имело доступ к MongoDB;
  3. Разработать C# приложение, которое использует Serilog и может отправлять логи в MongoDB.

Информация об окружении в демонстрационном примере

  • ОС основной системы - OS X
  • ПО для виртуализации: Parallels Desktop
  • Гостевая ОС - Windows 10

Развертывания MongoDB

Для развертывания MongoDB будем использовать среду виртуализации Docker.

Делаем это следующим образом:

sudo docker run --rm --name mongo_logs \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo mongod --bind_ip_all

MongoDB по умолчанию случает 27017 порт внутри контейнера. Пробросим этот порт на localhost основной ОС, чтобы иметь доступ к нему с виртуальной машины. С помощью переменных окружения MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD указываем соответственно логин и пароль для админа БД. По умолчанию MongoDB допускает соединения только из локальной сети с хоста 127.0.0.1. А так как подключаться к MongoDB мы будем с виртуальной машины с Windows 10 (другой хост), то необходимо разрешить доступ другим хостам. Для этого запускаем демон mongod с параметром --bind_ip_all.

Далее открываем mongo shell и логинимся под администратором:

use admin
db.auth("admin", "secret")

Затем создаем пользователя для приложения, отправляющего логи. Пользователь имеет доступ с базе данных logs, в которую мы будем отправлять логи.

use logs
db.createUser({
    user: 'app',
    pwd: 'secretPassword',
    roles: [{ role: 'readWrite', db:'logs'}]
})

СУБД готова к использованию.

В Parallels Desktop для Windows 10 настраиваем соединение основной ОС общую сеть (стоит по умолчанию). В этом случае localhost основной ОС (где на 27017 порту слушает MongoDB) будет виден из гостевой ОС (Win 10) под адресом 10.211.55.2.


Подготовка библиотеки Serilog

Программу, отправляющую логи в MongoDB, напишем на C# с применением библиотеки Serilog.Sinks.MongoDB.

Используем среду разработки Visual Studio 2013.

Создаем новый проект, и далее устанавливаем пакет Serilog.Sinks.MongoDB следующей командой, используя Nuget Package Manager:

PM > Install-Package Serilog.Sinks.MongoDB

Отправляем логи в MongoDB, используя следующий код (объявление класса Program и метода Main опущены):

var log = new LoggerConfiguration()
.WriteTo.MongoDB("mongodb://app:secretPassword@10.211.55.2/logs")
.CreateLogger();

var parameters = new Dictionary<string, object>();
parameters["id"] = 1;
parameters["firstname"] = "Michael";
parameters["lastname"] = "Jackson";

var list = new List<string>();
list.Add("item1");
list.Add("item2");
list.Add("item3");

log.Information("User: {@Parameters}", parameters);
log.Information("List with items: {@List}", list);
log.Debug("DEBUG");
log.Verbose("VERBOSE");
log.Error("ERROR");
log.Warning("What happened?");

log.Dispose();

Данный код создает объект логгера, который подключается к MongoDB на хосте как пользователь app. Продемонстрированы примеры отправки в логах обычных строк, а также словарей и списков без явного преобразования к строкам и без необходимости извлекать данные из коллекции. В конце у логгера вызывается метод Dispose, который отправляет все залогированные сообщения в MongoDB.

На видео показан весь процесс инициализации и конфигурирования MongoDB, а также процесс логирования.

Пример конфигурации в json

Ниже представленм пример [4] конфигурации json с помощью Serilog

{
  "Logging": [
    {
      "key": "minimum-level",
      "value": "Debug"
    },
    {
      "key": "using:RollingFile",
      "value": "Serilog.Sinks.RollingFile"
    },
    {
      "key": "using:ColoredConsole",
      "value": "Serilog.Sinks.ColoredConsole"
    },{
      "key": "using:RollingFile",
      "value": "Serilog.Sinks.RollingFile"
    },
    {
      "key": "using:ColoredConsole",
      "value": "Serilog.Sinks.ColoredConsole"
    },
    {
      "key": "write-to:RollingFile.pathFormat",
      "value": "/var/log/mylog-{Date}.log"
    },
    {
      "key": "write-to:RollingFile.retainedFileCountLimit",
      "value": "15"
    },
    {
      "key": "write-to:RollingFile.fileSizeLimitBytes",
      "value": "1048576"
    },
    {
      "key": "write-to:RollingFile.outputTemplate",
      "value": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{HttpRequestTraceId}] {Message}{NewLine}{Exception}"
    },
    {
      "key": "write-to:ColoredConsole.outputTemplate",
      "value": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{HttpRequestTraceId}] {Message}{NewLine}{Exception}"
    }
  ]
}

Вывод

Связка SeriLog и MongoDB идеальное решение для журналирования, которое легко ставится и поддерживается, а также позволяет сохранять объекты в легкочитаемом структурированном формате. SeriLog отлично решает проблему структурированного хранения событий. MongoDB — простая в администрировании база, имеющая достаточную популярность, удобный интерфейс и активное развитие[5] .

Примечания

  1. "State of MongoDB March, 2010". DB-Engines (in английский). 
  2. "Release Notes for MongoDB 3.4". MongoDB. 
  3. "Core Server Versions". MongoDB. 
  4. [1] Пример
  5. [2] Связка MongoDB & Serilog