Логгирование приложения на C# в базу данных FireBird Embedded с помощью NLog 2.0

Приступая к своему первому десктопному приложению на С#, я задался вопросом ведения логов. Изучив предложения по данной теме, за хорошие отзывы и отсутствие платы за использование, мой выбор пал на NLog 2.0. После чтения документации на сайте, а также местных статьей, я легко настроил вывод отладочной информации в текстовый файл. Но пытливый ум на месте не стоит, и так как в моем приложении используется база данных FireBird Embedded, то я решил настроить логгирование в нее. Вот тут я и получил пазл длиной в 5 часов. Информации по настройке NLog для FireBird (Embedded или нет не играет большой роли) практически нет, а та которая есть, относится с более ранним версиям NLog и уже потеряла актуальность. Засучив рукава и запасшись кефиром, я принялся преодолевать это препятствие, чему и посвящена данная статья.

Хочу отметить, что статья не затрагивает подключение провайдера FireBird .Net к проекту, а так же начальную установку NLog.

Настройка NLog заключается в правильной конфигурации файла NLog.config, который представляет собой XML-файл. На первых парах я столкнулся с проблемой, что после включения системы логгирования проект просто перестал запускаться, заваливаясь на инициализации главной формы приложения. Виной этому оказался плохо сконфигурированный мной NLog. Чтобы упростить себе задачу и сэкономить нервы, необходимо добавить две строки в конфигурационный файл:

throwExceptions="true"
internalLogFile="file.txt"

При следующем запуске приложения, в папке с исполняемым файлом будет создан file.txt, который содержит довольно подробный лог самой системы NLog и позволит отловить ошибки конфигурации.
Настройка «приемника» логов заключается в тег «target». Самым сложным было получить 3 вещи:
1) Имя провайдера СУБД с его токеном
2) Строку подключения к БД
3) Запрос к БД и его параметры

Первый пункт удалось преодолеть с помощью гугла. Но со вторым и третьим пунктом было сложнее. Строку подключения я получил из моего приложения, которое, на основании других мануалов уже могло подключаться к базе FireBird. Запрос и его параметры я разобрал с помощью не совсем научного метода «тыка». Чтобы не томить, сразу приведу работающий конфиг «приемника»:
<target
     xsi:type="Database"
     name="db"
     dbProvider="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
     useTransactions="true"
     connectionString="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
     keepConnection="true"
     commandText="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);">
   <parameter layout="${longdate}" name="@DT" />
   <parameter layout="${level}" name="@LEVEL" />
   <parameter layout="${message}" name="@LOG_TEXT" />
   <parameter layout="${logger}" name="@CLASS" />
   <parameter layout="${stacktrace}" name="@STACK_TRACE" />
</target>


* This source code was highlighted with Source Code Highlighter.


dbProvider – это имя провайдера FireBird .NET, которое соответствует его текущей официальной версии 2.6.5. Для будущих версий нужно будет только поменять циферки, Токен (PublicKeyToken=3750abcc3150b00c) должен остаться тот же.

connectionString – строка подключения. По большому счету, когда она сформирована, то понять и поменять в ней что-то под себя не составит никакого труда. В данном примере подключение настроено на сервер FireBird Embedded, базу FYT.FDB, которая лежит в каталоге с исполняемым файлом. Для FireBird Classic или SuperServer нужно только поменять “server type” и “client library”.

commandText – запрос на вставку данных в базу. Параметры, которые передаются логгером, отмечаются «собакой», т.е. @. Ниже, атрибуты в тегах «parameter» показывают NLog то, чем нужно подменять каждый параметр в запросе. Список всех доступных параметров замены (layout) можно найти на сайте NLog.

В заключение, приведу полный листинг конфигурационного файла NLog.config:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   throwExceptions="true"
   internalLogFile="file.txt">

 <targets>
  <target
     xsi:type="Database"
     name="db"
     dbProvider="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
     useTransactions="true"
     connectionString="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
     keepConnection="true"
     commandText="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);">
   <parameter layout="${longdate}" name="@DT" />
   <parameter layout="${level}" name="@LEVEL" />
   <parameter layout="${message}" name="@LOG_TEXT" />
   <parameter layout="${logger}" name="@CLASS" />
   <parameter layout="${stacktrace}" name="@STACK_TRACE" />
  </target>
 </targets>

 <rules>
  <logger name="*" minlevel="Debug" writeTo="db" final="true"/>
 </rules>
</nlog>


* This source code was highlighted with Source Code Highlighter.


Спасибо за внимание! Надеюсь, моя статья поможет вам не тратить 5 часов на настройку системы ведения логов в БД FireBird!
  • +22
  • 6,5k
  • 4
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 4
  • 0
    А можно NLog настроить так, чтобы он логи сохранял в БД, а при неудачной попытке записи лога в БД — то в текстовый файл?
    • 0
      Сейчас как раз пытаюсь разобраться с конфигом, чтобы можно было применять условия. На форуме NLog-а есть что-то похожее, но для лохматой версии, в новой не работает. Вообще странно, что такая хорошая система имеет такую куцую документацию.
    • 0
      Добрый день! Вопрос чуть не в тему. А не подскажете семпл использования\настройки firebird embedded с С#?

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое