NLog — логирование в C#

Недавно понадобилось прикрутить лог в программе на C#. Логи — самый лучший способ найти ошибку и отследить все действия пользователя. Я фанат логов 😀
Первая мысль была написать что-то свое. Но любопытство и лень пересилила и я сделал поиск в гугле (не напрасно!). Наткнулся на прекрасную библиотеку NLog. По функционалу библиотека на большой высоте. Бесплатная и хорошо настраиваемая (спец. конфигурационный файл). 2 (!!!) десятка типов всяких логов. Надо писать лог в базу? Пожалуйста. Надо отсылать по почте? Нет ничего проще. и т.д.
Документация хороша. В дистрибутив включены несколько десятков примеров конфиг-файлов. Так что очень легко можно разобраться.

Пара ссылок для закрепления материала:
Официальны сайт NLog [eng]
«Hello, NLog» — [рус.] статья с блога Ильи Дубаденко
«Introduction to NLog» — [eng] CodeProject
Раздел блога «О разработке на .Net» посвященный NLog [рус.]
Логгирование приложения на C# в базу данных FireBird Embedded с помощью NLog 2.0 [рус.]

Пример. Хотим лог который будет создаваться заново при каждом запуске приложения.
Создаем конф-лог.

  1. В Visula Studio выбираем «Project» — «Add New Item…»
  2. Выбираем «Empty NLog configuration file»
  3. Выбираем появившийся файл .conf в «Solution Explorer»
  4. Изменяем его проперти «Copy to Output Diretory» на «Copy always». Конф-файл будет всегда копироваться туда где строиться exe

Теперь содержание самого файла.
В нем содержит 2 тега после корня

  • Targets – В нем идет оисание лога т.е. источника для записи данных
  • Rules – Правила указывающие в какие случаях писать в определенный лог
<?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">

  <!-- make sure to set 'Copy To Output Directory' option for this file -->
  <!-- go to http://nlog-project.org/wiki/Configuration_file for more information -->

<targets>
    <target name="run_log"
    xsi:type="File"
    layout="${longdate}|${level}| ${message}"
    deleteOldFileOnStartup="True"
    concurrentWrites="true"
    KeepFileOpen ="False"
    fileName="${basedir}/Application.log"
    encoding="win-1251"/>
</targets>

<rules>
    <logger name="*" minlevel="Debug" writeTo="run_log" />
    <logger name="*" minlevel="Trace" writeTo="run_log" />
</rules>
</nlog>

Расписываться не буду. Описание этого target`са можно посмотреть в хэлпе по библиотеке.
Теперь код. Лог я поместил сразу в main и сдела статичным.

using NLog;

namespace Test
{
    static class Program
    {
        public static Logger log;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                log = LogManager.GetCurrentClassLogger();

                log.Trace("Version: {0}", Environment.Version.ToString());
                log.Trace("OS: {0}", Environment.OSVersion.ToString());
                log.Trace("Command: {0}", Environment.CommandLine.ToString());

                NLog.Targets.FileTarget tar = (NLog.Targets.FileTarget)LogManager.Configuration.FindTargetByName("run_log");
                tar.DeleteOldFileOnStartup = false;
            }
            catch (Exception e)
            { 
                MessageBox.Show("Ошибка работы с логом!n"+ e.Message);
            }

            // ловим все не обработанные исключения
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_Exception);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
    }
}

Теперь из любого места программы можно записать данные в лог. Например.
Program.log.Trace(«run {0}», this.Text);

Update 27.08.2012
Для записи в SQLite прописываем:

    <target name="Database" xsi:type="Database" keepConnection="true"
            useTransactions="false"
            dbProvider="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"
            connectionString="Data Source=${basedir}log.db;Version=3;"
            commandText="INSERT into LOGTABLE(Timestamp, Loglevel, Message) values(@Timestamp, @Loglevel, @Message)">
      <parameter name="@Timestamp" layout="${longdate}"/>
      <parameter name="@Loglevel" layout="${level:uppercase=true}"/>
      <parameter name="@Message" layout="${message}"/>
    </target>

log.db находится в каталоге программы.
Для создания таблицы в log.db выполните команду:

BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS LOGTABLE (Message TEXT, Loglevel varchar(50), Timestamp varchar(100));  
COMMIT;

Для записи в формате CSV добавляет в конфиг следующий раздел:

    <target name="csv" xsi:type="File" fileName="${basedir}/log.csv">
      <layout xsi:type="CSVLayout">
        <column name="time" layout="${longdate}" />
        <column name="message" layout="${message}" />
      </layout>
    </target>

NLog — логирование в C#: 9 комментариев

  1. fuzzokolobok

    Вообще везде в промышленности, где я был или что-то видел используется log4net. Не берусь судить или сравнивать — т.к. не пробовал, но вот дела обстоят так

  2. BorisMor

    Тоже смотрел log4net. Распространенность скорее всего связанна что библиотека хорошая и давно вышла. Но вот так же давно уже и не выходят новые версии.
    На офиц.сайте прописана поддержка Framework 2.0.
    Плюс у NLog возможностей больше. Хотя большая часть из них никому и не сдалась)
    В принципе log4net и NLog очень схожи. Даже структура конфигурационного файла в чем то похожа.

  3. Gor

    Мы используем log4net и очень доволны. Что нравится: быстрый, удобный, легко конфигурируемый. Кроме того многие сторонние библиотеки также используют log4net, что позволяет единообразно конфигурировать логи системы.
    P.S. Есть еще http://msdn.microsoft.com/en-us/library/ff647242.aspx

  4. Уведомление: C# и SQLite « IT записки

  5. MaksTR

    NLog на данный момент являеться оптимальным вариантом под C#. log4net неплох но уже давно не развиваеться. логирование с помощью Microsoft Enterprise Library не очень удобно и уступает по возможностям NLog. в Геноме логер работает через ихний же IoC-контейнер, что являеться лишней тратой ресурсов, да и в целом библиотека тяжеловата. а писать свой велосипед стоит разве что начинающим для общего развития, в комерческих проектах велосипедам не место.

  6. Аноним

    В Visula Studio выбираем «Project» — «Add New Item…»
    Выбираем «Empty NLog configuration file»
    Выбираем появившийся файл .conf в «Solution Explorer»
    Изменяем его проперти «Copy to Output Diretory» на «Copy always». Конф-файл будет всегда копироваться туда где строиться exe
    —————-
    Объясните подробнее, и вообще было бы хорошо писать не сравнение, а именно Getting Started для системы которую описываете, чтобы КПД было выше

  7. Аноним

    Почему не написали что надо добавить private static Logger log = LogManager.GetCurrentClassLogger();

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *