Приступая к своему первому десктопному приложению на С#, я задался вопросом ведения логов. Изучив предложения по данной теме, за хорошие отзывы и отсутствие платы за использование, мой выбор пал на NLog 2.0. После чтения документации на сайте, а также местных статьей, я легко настроил вывод отладочной информации в текстовый файл. Но пытливый ум на месте не стоит, и так как в моем приложении используется база данных FireBird Embedded, то я решил настроить логгирование в нее. Вот тут я и получил пазл длиной в 5 часов. Информации по настройке NLog для FireBird (Embedded или нет не играет большой роли) практически нет, а та которая есть, относится с более ранним версиям NLog и уже потеряла актуальность. Засучив рукава и запасшись кефиром, я принялся преодолевать это препятствие, чему и посвящена данная статья.
Хочу отметить, что статья не затрагивает подключение провайдера FireBird .Net к проекту, а так же начальную установку NLog.
Настройка NLog заключается в правильной конфигурации файла NLog.config, который представляет собой XML-файл. На первых парах я столкнулся с проблемой, что после включения системы логгирования проект просто перестал запускаться, заваливаясь на инициализации главной формы приложения. Виной этому оказался плохо сконфигурированный мной NLog. Чтобы упростить себе задачу и сэкономить нервы, необходимо добавить две строки в конфигурационный файл:
При следующем запуске приложения, в папке с исполняемым файлом будет создан file.txt, который содержит довольно подробный лог самой системы NLog и позволит отловить ошибки конфигурации.
Настройка «приемника» логов заключается в тег «target». Самым сложным было получить 3 вещи:
1) Имя провайдера СУБД с его токеном
2) Строку подключения к БД
3) Запрос к БД и его параметры
Первый пункт удалось преодолеть с помощью гугла. Но со вторым и третьим пунктом было сложнее. Строку подключения я получил из моего приложения, которое, на основании других мануалов уже могло подключаться к базе FireBird. Запрос и его параметры я разобрал с помощью не совсем научного метода «тыка». Чтобы не томить, сразу приведу работающий конфиг «приемника»:
Хочу отметить, что статья не затрагивает подключение провайдера 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!