![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
HalkaR |
|
||||||||||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
Очень часто в приложение приходится сохранять логи происходящего. Сохранять информацию об обработанных исключених, о действиях пользователя. Вся эта информация нужна для обнаружения потенциальных проблем и для облегчения решения проблем существующих.
Для данных целей хорошо подходит библиотека 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/...ternLayout.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 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
закреплю тему на недельку, пусть народ почитает. интересно.
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
По просьбе некоторых участников форума - краткое продолжение (сожалею не получилось побольше написать - не успел).
В прошлый раз я разобрал написал как просто начать работать с 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 Фильтрует по тексту сообщения (по подстроке). Это сообщение отредактировал(а) HalkaR - 29.6.2007, 13:22 |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
HalkaR, как вы отнесётесь к внесению вашего творчества в FAQ, после недельного висения на "доске почёта"?
![]() -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
cully, если людям пригодится, то только за. Постараюсь в выходные еще дописать.
|
|||
|
||||
Blazkovicz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Appender и Layout также можно настраивать не в коде а в конфиг файле
может быть это будет более удобно? могу написать про это |
|||
|
||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 6 Всего: 65 |
Blazkovicz,
Конечно напиши. Вещь, по любому, нужная. HalkaR, Отдельный респект. ![]() Ведение логов крайне необходимо для сопровождения и поддержки программы у клиента, а не только на стадии тестирования. Это сообщение отредактировал(а) thomas - 21.11.2007, 14:54 -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
Blazkovicz |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
В файле конфигурации заводим секцию:
затем вставляем информацию про аппендеры, категории, фильтры, рендереры: пример, в котором лог записывается так, чтобы его можно было смотреть в ексель(в pattern табы вместо пробелов), что удобно:
в коде программы в main процедуре инициализируем настройки; эта процедура должна проработать перед какой либо записью в лог
в классе ClassName, где используем запись в лог нужно завести статическую переменную:
собственно использование в нужных местах:
Надеюсь, написала понятно Добавлено через 4 минуты и 6 секунд В свою очередь, возникает вопрос: Как в приложении различать уровни сообщений debug и info, error и fatal? есть ли какие-нибудь статьи на эту тему? Добавлено через 12 минут и 26 секунд Да, кстати в примере использовались библиотеки log4net, log4net.config, NUnit.Framework |
||||||||||
|
|||||||||||
GalSys |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 15.1.2008 Репутация: нет Всего: нет |
Вы писали:
Можете на примере показать как это делается ? Допустим есть многопоточное приложение, требуется записывать логи в отдельные файлы для каждого потока. Как можно все это програмно реализовать. Заранее спасибо. |
|||
|
||||
vee312 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 16.1.2008 Репутация: нет Всего: нет |
Сегодня столкнулся с подобной проблемой. Вот найденное мною решение:
Вся фишка в создании нового Repository. Это приводит к формированию новой иерархии appender'ов и их не нужно конфигурировать фильтрами и левелами, дабы избежать пересечения в логировании. Если найдете другие варианты - отпишите пожалуйста )) Это сообщение отредактировал(а) vee312 - 16.1.2008, 14:13 |
||||
|
|||||
Kosya4ok |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 23.7.2007 Репутация: нет Всего: нет |
А как быьб с передачей параметров из C# кода логгеру определенному в конфиг файле?
|
|||
|
||||
Mihanya |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 20.10.2009 Репутация: нет Всего: нет |
У меня вопрос такой: log4net протоколирует в том же потоке, в котором был вызван метод this.logger.Info("Чего нибудь")? или в отдельном?
|
|||
|
||||
HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
AFAIK в том же.
|
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |