log4net - логгер для .net-приложений, позволяющий выводить любые сообщения в файл, несколько файлов, в БД или еще куда-нибудь. Кроме самого пользовательского сообщения, может вывести подробную информацию (время, класс, метод, и т.д., где был вызван вывод данного сообщения).
Подключение
Web Application
- Добавить log4net.dll в References приложения
- Добавить в
AssemblyInfo.cs
строку
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
Web Site
Просто переписать log4net.dll в каталог Bin
Настройка
Логгер настраивается в web.Config. Вначале в раздел configSections следует добавить строчку:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net">
Затем, нужно добавить раздел:
<log4net debug="true">
...
</log4net>
В этом разделе идет основная настройка логгера. В разделе могут быть потомки типа appender, logger и root. Назначение элемента logger пока что осталось для меня загадкой, так что рассмотрим остальные.
Appender
Для того, чтобы заставить log4net что-то куда-то писать, нужно определить Appender. Подходящее русское обозначение мне придумать не удалось, но суть в том, что он хранит настройки одного логгера. Типов appender-ов существует много (см. документацию), но мне довелось работать только с RollingFileAppender
, который определяет логгер, пишущий в файл. Другие типы appender-ов позволяют писать в базу данных(AdoNetAppender
), Windows EventLog (EventLogAppender
) и т.д. Рассмотрим пример:
<appender name="ERRORFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingmodel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="\Logs\errors.log" />
<appendtofile value="true" />
<rollingstyle value="Size" />
<maxsizerollbackups value="10" />
<maximumfilesize value="200MB" />
<staticlogfilename value="true" />
<filter> ... </filter>
<layout> ... </layout>
</appender>
Назначение перечисленных Appender-а, в принципе, понятно. Следует отметить параметр lockingModel
и его значение MinimalLock
. Дело в том, что log4net во время работы приложения жестко лочит файл с логом, его нельзя ни открыть (разве что редактором Far-а), ни удалить. Поэтому, если очень хочется удалить лог web-приложения, нужно перезапускать IIS, что не есть хорошо. Данная настройка "разлочивает" лог, его свободно можно удалять и открывать хоть для записи.
Ключевыми настройками Appender-а являются Filter и Layout.
Filter
Данная настройка позволяет отфильтровывать сообщения по некоторому признаку. Для фильтра обязательно указывается тип. Существует несколько типов фильтров, можно также писать свои. Наиболее часто используемые фильтры - по типу сообщения (LevelRangeFilter
и LevelMatchFilter
) и по тексту сообщения (StringMatchFilter
). Для начала, остановимся на типах (уровнях) сообщений. Сообщения в log4net делятся на несколько уровней:
- ALL
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
- OFF
Разработчик выбирает, какой тип сообщений в каком случае ему использовать. Логгер же можно настроить таким образом, чтобы, к примеру, ошибки выводились отдельно, а отладочные данные - отдельно. Для это и пишутся фильтры. Рассмотрим на примерах.
Фильтр, выбирающий только ошибочные и фатальные сообщения:
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR"/>
<levelMax value="FATAL"/>
</filter>
Фильтр, выбирающий только отладочные сообщения
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="DEBUG"/>
<acceptOnMatch value="true"/>
</filter>
Layout
В разделе Layout определяется формат вывода сообщений в файл. Как ранее было сказано, log4net, помимо самого сообщения, может выводить кучу полезной информации. Layout может выглядеть, например, таким образом:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p [%d] [%C.%M] %m%n"/>
</layout>
В conversionPattern указано, какие значения и в каком формате будут выводиться в лог. Выходной лог с таким Layout-ом получится примерно таким:
DEBUG [2008-04-08 17:45:14,662] [TableTemplates.GetTemplate] Is visible: [visible]
DEBUG [2008-04-08 17:45:14,662] [TableTemplates.GetTemplate] Report Footer (rows:1)
DEBUG [2008-04-08 17:45:14,662] [TableTemplates.GetTemplate] Number of cells in row [2]
INFO [2008-04-08 17:45:14,663] [ClientDataObjects.get_ClientObjects] Client object found in session
Значения ключей conversionPattern:
%p
— Тип события лога (DEBUG, ERROR и т.д.)
%d
— Дата и время, когда логгирующая функция была вызвана. Можно задавать различные форматы вывода даты и времени. К примеру, %d{HH:mm:ss,SSS}
отображает только время
%C
— Имя класса, в котором была вызвана какая-либо функция лога
%M
— Имя метода
%m
— Собственно, сообщение в лог
%F
— Имя файла
%l
— Номер строки
%r
— Количество миллисекунд, прошедших с начала работы программы
%t
— Имя потока
%n
— Переход на новую строку
%%
— Символ "%"
Root
Написать Appender-ы недостаточно для того, чтобы log4net начал писать логи. Нужно еще зарегистрировать их в корне лога, вот таким вот образом:
<root>
<level value="WARN" />
<appender-ref ref="ERRORFileAppender" />
<appender-ref ref="DEBUGFileAppender" />
</root>
level
- уровень, сообщения ниже которого не выводятся ни в один лог. Приведенная запись значит, что в логи не будут выводиться сообщения типа DEBUG и INFO.
Использование
Я делаю так. Пишу класс:
using log4net;
using log4net.Config;
using System;
public static class Logger
{
private static readonly ILog log = LogManager.GetLogger(typeof(Logger));
public static ILog Log
{
get { return log; }
}
public static void InitLogger()
{
XmlConfigurator.Configure();
}
}
Потом в Global.asax в метод Application_Start добавляю строчку:
И подключение лога в код готово. После этого в любом месте кода можно написать что-то вроде:
Logger.Log.Debug("Some message");
Интерфейс
ILog
представляет различные методы для вывода сообщений различных типов. Рассмотрим некоторые методы:
Функции |
Описание |
Пример |
Info(String message)
Debug(String message)
Warn(String message)
Error(String message)
Fatal(String message)
|
Вывод в лог сообщения message
|
Logger.Log.Info("Sample log message");
|
InfoFormat(String format, params object[] args)
DebugFormat(String format, params object[] args)
WarnFormat(String format, params object[] args)
ErrorFormat(String format, params object[] args)
FatalFormat(String format, params object[] args)
|
Вывод в лог сообщения c параметрами. Аналогично выводу сообщения String.Format(format, args) .
|
Logger.Log.DebugFormat("Key={0}, Value={1}", key, value);
|
Info(String message, Exception e)
Debug(String message, Exception e)
Warn(String message, Exception e)
Error(String message, Exception e)
Fatal(String message, Exception e)
|
Вывод в лог сообщения с исключением. В лог помещается целиком текст исключения и stack trace.
|
try
{
a = b / c;
}
catch (Exception e)
{
Logger.Log.Error("Exception catched while calculation.", e);
}
|