Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Getting started with log4net |
Автор: HalkaR 28.6.2007, 12:27 | ||||||||||
Очень часто в приложение приходится сохранять логи происходящего. Сохранять информацию об обработанных исключених, о действиях пользователя. Вся эта информация нужна для обнаружения потенциальных проблем и для облегчения решения проблем существующих. Для данных целей хорошо подходит библиотека log4net (имеющая реализации на множестве других языков). Как выяснилось у многих с этой простой библиотечкой проблемы. Постараюсь написать краткий док по тому как начать им пользоваться. Так сказать Get Started. Прошу сильно не бить если что не понравится, написал по просьбе трудящихся краткий гайд. В будущем постараюсь расширить и дополнить. 1. Layout Для начал самое простое - форматирование вывода. Вообще log4net предоставляет множетсво паттернов. Но мы разберем самый удобный и общий из них - PatternLayout.
Этот пример вывоводит следующую информацию: %d - дата %p - тип сообщения (пятерка в записи %5p означает максимальную длинну - 5 символов) %t - поток из которого была произведена запись %M - метод %F - файл %L - строка %m - сообщение %n - символ перехода на новую строку Все остальные символ используются только для форматирования. Собственно говоря - вот и все. Из других полезных паттернов могу назвать следующие %a или %appdomain - выводит название домена из которого была произведена запись. %C или %class - класс из ктогорого была запись. %exception - выводит исключение если оно было передано. Остальные паттерны можно найти на http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html 2. Appenders Для вывода данных в log4net изспользуются Appender'ы (как перевести не знаю). Их в поставке очень много и каждый найдет нужный себе. Я постарюсь в кратце рассказать о 3-х. Все аппендеры являются потомками класса AppenderSkeleton. Из важных полей этого класса опишу следующие: Свойство Layout - используется для установки формата вывода. Метод AddFilter - используется для добавления фильтра. Метод ClearFilters - используется для очистки всех устанволенных фильтров. Метод ActivateOptions - используется для активации настроек аппендера. Более подробно опишу эти свойства и методы позже. Некоторые аппендеры являются наследниками класса BufferedAppenderSkeleton, отличающегося тем, что запись происходит не мнгновенно, а по мере заполнения буфера. Специальные свойства BufferedAppenderSkeleton: BufferSize - размер буфера сообщений (устанавливает максимальное количество сообщений). Если значение установлено в 1 или менее, то буфер записывает сообщения синхронно. Lossy, Evaluator, LossyEvaluator - отвечают за возможность потери событий из списка (не пользовался, поэтому описывать не буду). ConsoleAppender - используется для вывода данных на консоль. Имеет только одно особое свойство Target, которое отвечает за поток вывода (имеет два значения "Console.Out" или "Console.Error"). Удобно использовать данный аппендер для отладки в Visual Studio - вся логируемая информация попадает в Output окно IDE. FileAppender - используется для вывода сообщений в файл. Имеет множество своих свойств: AppendToFile - флаг, определяющий пересоздается ли файл при инициализации конфигурации или каждый раз данные дописываются. Encoding - кодировка вывода. File - имя фала (и путь до него) в который будет выводится информация. LockingModel - модель блокировки. AdoNetAppender - аппендер записывающий сообщения в базу данных. Достаточно простой аппендер. ИЗ свойств отличаются CommandText, CommandType, ConnectionString, ConnectionType, ReconnectOnError и UseTransactions и метод AddParameter - отвечающие за подключение к базе и внесение данных. Соответственно единственный сложный момент - это создание запроса на вставку данных в базу. Простейший пример:
Теперь собираем все это вместе:
Класс BasicConfiguration используется для простейшего способа конфигурации логгера. Существуют альтернативные способы, но этот самый простой. Как видите все предельно просто. Теперь наш логгер настроен и будет выводить все сообщения в консоль и в файл. Теперь попытаемся им воспользоваться.
Таким образом для каждого класса мы можем определить свой логгер или создать глобальный логгер для всей программы. Интерфейс Ilog выглядит следующим образом:
Методы Debug, Info, Warn, Error, Fatal используются для создания сообщений с разрым уровнем критичности. Каждому из этих методов передается сообщение и исключение (опционально). За сим на первый раз все. |
Автор: stab 29.6.2007, 07:48 |
закреплю тему на недельку, пусть народ почитает. интересно. |
Автор: HalkaR 29.6.2007, 13:21 |
По просьбе некоторых участников форума - краткое продолжение (сожалею не получилось побольше написать - не успел). В прошлый раз я разобрал написал как просто начать работать с log4net. Теперь давайте пойдем не вглубь а в ширь. 1. Layout В прошлый раз я описал layout PatterLayout. Теперь опишем остальные: log4net.Layout.ExceptionLayout Выводит только текст исключения. log4net.Layout.RawTimeStampLayout Выводит timestamp. log4net.Layout.RawUtcTimeStampLayout Выводит timestamp в универсальном времени. log4net.Layout.SimpleLayout Простой layout? выводит данные в формате: [level] - [message]. log4net.Layout.XmlLayout Выводит текст сообщений в виде XML. log4net.Layout.XmlLayoutSchemaLog4j Также выводит текст сообщений в виде XML, но используем схему характерную для log4j. 2. Фильтры. В прошлый раз фильтров я не коснулся. Аппендеры используют фильтры для выборки сообщений. По умолчанию аппендеры записывают все сообщения. log4net.Filter.DenyAllFilter Данный фильтр не пропускает не одного сообщения, используется исключительно с другими фильтрами. log4net.Filter.LevelMatchFilter Данный фильтр позволяет жестко задать разрешение на вывод сообщений определенного уровня (конструктор принимает уровень и флаг, показывающий будут ли выводится сообщения данного уровня или нет). log4net.Filter.LevelRangeFilter Работает аналогично предыдущему фильтру только позволяет задавать промежуток уровней (от и до). log4net.Filter.LoggerMatchFilter Выводит сообщения только от определнного логгера (фильтрация по имени логгера). log4net.Filter.PropertyFilter Фильтрует по значениям свойств сообщения (по подстроке). log4net.Filter.StringMatchFilter Фильтрует по тексту сообщения (по подстроке). |
Автор: stab 29.6.2007, 13:31 |
HalkaR, как вы отнесётесь к внесению вашего творчества в FAQ, после недельного висения на "доске почёта"? ![]() |
Автор: HalkaR 29.6.2007, 14:11 |
cully, если людям пригодится, то только за. Постараюсь в выходные еще дописать. |
Автор: Blazkovicz 21.11.2007, 14:18 |
Appender и Layout также можно настраивать не в коде а в конфиг файле может быть это будет более удобно? могу написать про это |
Автор: thomas 21.11.2007, 14:53 |
Blazkovicz, Конечно напиши. Вещь, по любому, нужная. HalkaR, Отдельный респект. ![]() Ведение логов крайне необходимо для сопровождения и поддержки программы у клиента, а не только на стадии тестирования. |
Автор: Blazkovicz 21.11.2007, 15:23 | ||||||||||
В файле конфигурации заводим секцию:
затем вставляем информацию про аппендеры, категории, фильтры, рендереры: пример, в котором лог записывается так, чтобы его можно было смотреть в ексель(в pattern табы вместо пробелов), что удобно:
в коде программы в main процедуре инициализируем настройки; эта процедура должна проработать перед какой либо записью в лог
в классе ClassName, где используем запись в лог нужно завести статическую переменную:
собственно использование в нужных местах:
Надеюсь, написала понятно Добавлено через 4 минуты и 6 секунд В свою очередь, возникает вопрос: Как в приложении различать уровни сообщений debug и info, error и fatal? есть ли какие-нибудь статьи на эту тему? Добавлено через 12 минут и 26 секунд Да, кстати в примере использовались библиотеки log4net, log4net.config, NUnit.Framework |
Автор: GalSys 15.1.2008, 18:24 | ||
Вы писали:
Можете на примере показать как это делается ? Допустим есть многопоточное приложение, требуется записывать логи в отдельные файлы для каждого потока. Как можно все это програмно реализовать. Заранее спасибо. |
Автор: vee312 16.1.2008, 13:38 | ||||
Сегодня столкнулся с подобной проблемой. Вот найденное мною решение:
Вся фишка в создании нового Repository. Это приводит к формированию новой иерархии appender'ов и их не нужно конфигурировать фильтрами и левелами, дабы избежать пересечения в логировании. Если найдете другие варианты - отпишите пожалуйста )) |
Автор: Kosya4ok 14.11.2008, 17:03 |
А как быьб с передачей параметров из C# кода логгеру определенному в конфиг файле? |
Автор: Mihanya 21.10.2009, 13:33 |
У меня вопрос такой: log4net протоколирует в том же потоке, в котором был вызван метод this.logger.Info("Чего нибудь")? или в отдельном? |
Автор: HalkaR 21.10.2009, 13:44 |
AFAIK в том же. |