Логирование с помощью Microsoft Enterprise Library 4.1

Original author: David Starr
  • Translation
В данной статье рассказывается как работать с блоком логирования из библиотеки Microsoft Enterprise Library 4.1. Решил разобраться после посещения Patterns & Practices Roadmap Kiev.

Установка Enterprise Library


Загрузить Enterprise Library 4.1 можно отсюда. Помните, что кроме блока логирования устанавливается много других компонентов.


Создание нового проекта в Visual Studio


Откройте Viual Studio, создайте новый консольный проект (console application) и назовите его, к примеру, HelloWorldEntLibLogging.

Далее необходимо добавить ссылку (reference) на библиотеку:

image

Конфигурация логирования


Большинство функциональности EntLib конфигурируется, в том числе и блок логирования. Вам необходимо добавить в проект конфигурационный файл и добавить информацию с помощью аддона для Visual Studio, который установился вместе с библиотекой.

С помощью Solution Explorer добавляем новый Application Configuration File, имя файла оставляем по умолчанию — app.config:

image

Далее нажимаем правой кнопкой мыши на app.config и выбираем Edit Enterprise Library Configuration:

image

В открывшемся редакторе выбираем New | Logging Application Block:

image

В дереве редактора должен появиться новый Logging Application Block:

image

Закрываем редактор, открываем app.config:

  1: <?xml version="1.0" encoding="utf-8"?>
  2: <configuration>
  3:   <configSections>
  4:     <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  5:     <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  6:   </configSections>
  7:   <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
  8:     defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
  9:     <listeners>
 10:       <add source="Enterprise Library Logging" formatter="Text Formatter"
 11:         log="Application" machineName="" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
 12:         traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
 13:         name="Formatted EventLog TraceListener" />
 14:     </listeners>
 15:     <formatters>
 16:       <add template="Timestamp: {timestamp} Message: {message} Category: {category} Priority: {priority} EventId: {eventid} Severity: {severity} Title:{title} Machine: {machine} Application Domain: {appDomain} Process Id: {processId} Process Name: {processName} Win32 Thread Id: {win32ThreadId} Thread Name: {threadName} Extended Properties: {dictionary({key} - {value} )}"
 17:         type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
 18:         name="Text Formatter" />
 19:     </formatters>
 20:     <categorySources>
 21:       <add switchValue="All" name="General">
 22:         <listeners>
 23:           <add name="Formatted EventLog TraceListener" />
 24:         </listeners>
 25:       </add>
 26:     </categorySources>
 27:     <specialSources>
 28:       <allEvents switchValue="All" name="All Events" />
 29:       <notProcessed switchValue="All" name="Unprocessed Category" />
 30:       <errors switchValue="All" name="Logging Errors & Warnings">
 31:         <listeners>
 32:           <add name="Formatted EventLog TraceListener" />
 33:         </listeners>
 34:       </errors>
 35:     </specialSources>
 36:   </loggingConfiguration>
 37: </configuration>


* This source code was highlighted with Source Code Highlighter.

Сейчас в файле много различных настроек, но они нас в данный момент не интересуют.

Добавляем код логирования в приложение


Подключаем пространство имен:

using Microsoft.Practices.EnterpriseLibrary.Logging;

* This source code was highlighted with Source Code Highlighter.

Далее добавляем следующий код в Program.cs:

class Program
{
  static void Main(string[] args)
  {
    LogEntry entry = new LogEntry()
               {
                 Message = "Hello Ent. Lib. Logging"
               };
   
    Logger.Write(entry);
  }
}


* This source code was highlighted with Source Code Highlighter.

Это все, что нужно сделать!

Запуск приложения и проверка логирования


Выполняем приложение, далее запускаем Windows Event Viewer и смотрим последние события. Вы должны увидеть записанную информацию:

image

Также вы можете указать Severity в вашем LogEntry:

LogEntry entry = new LogEntry()
           {
             Message = "Hello Ent. Lib. Logging",
             Severity = TraceEventType.Critical
           };


* This source code was highlighted with Source Code Highlighter.


Если вы запустите приложение сейчас, то увидите критическую ошибку Windows Event Viewer.

P.S. От себя добавлю, что помимо блока логирования в состав EntLib входит большое количество других блоков, в том числе Caching, Cryptography, Data Access, Exception Handling, Logging, Policy Injection, Security, Validation и Unity. Более подробно можно почитать на сайте http://entlib.codeplex.com/.
Share post

Similar posts

Comments 23

    –6
    Может конечно Microsoft Enterprise Library 4.1 и пригодится для работы с криптографией или чем-нибудь другим, но данный пример — лабораторная работа по логированию. Это и штатными средствами делается не сложнее, а вот тащить со сборкой еще и кучу длл это уже лишнее для таких тривиальных задач.
    Привели бы какой-нибудь другой пример, в котором обвертка действительно скрывает от нас кучу рутинного кода.
      0
      Данный пример необходим в первую очередь тем, кто никогда раньше не работал (либо не слышал) о существовании EntLib (а таких, я уверен, много).
        –4
        Я лично тоже никогда не слышал, но и ваш пример меня никак не заинтересовал. Данный пример изобрел заново велосипед. Нет интереса использовать эту библиотеку, мало того, смотря на это, могу сделать вывод что там всё в ней такого же рода — никому не нужные обвертки на элементарные отрывки кода.
        Вот я в большинстве своём работаю с Data Access — вот приведите для меня такой пример доступа к данным в MS SQL Server, который бы позволил мне сократить мои трудозатарты — тогда и я буду использовать вами рассмотренную библиотеку.
          +1
          Я вообще не понимаю вашего тона. Если вы что-то не увидели — это ваши проблемы. К тому же библиотека содержит инструменты для Data Access, можете самостоятельно посмотреть. Если же не хотите — за вас никто ничего делать не будет.
            –3
            Просто я считаю что это совершенно бесполезный перевод, не топик, а просто тупой перевод тупой западной стать.
            Давай те делать переводы статей «Hello Word» — там используется библиотека System, ее можно скачать с сайта Майкрософт, может ктонить не знает как ее пользоваться…
            Как вы сказали — цель вашего топика: обратить внимание. Так обратите внимание на интересные вещи, а не занимайте мое время.
            Еще раз повторюсь — с этой библиотекой не работал, ничего про нее сказать не могу, а вы на мой взгляд, делаете ей антирекламу, показывая совершенно не на те вещи, которые заслуживают внимание.
              –2
              Вот интересно, почему такой уважаемый критик за полтора года написал только одну статью? Может хватит оффтопить, не тратьте свое и чужое время.
                –2
                Ну если уж переходить на личности, что вы уже сделали, я то — критик.
                И мой единственный топик принес больше пользы, чем ваши «обзоры», в которых вы удосужились только и привести ссылки на сайты контролов, не сказав ни слова о их функционале. Если мне понадобиться найти контрол или библиотеку, то я сам это сделаю с помощью гугла, а не с помощью ваших совершенно не информативных статей.
                А что касаемо офтопа — я выражаю свое мнение по поводу ваших топиков, именно для этого комментарии и придуманы.
                  –3
                  Ах, да, забыл сказать спасибо за плювок в карму, ой боюсь боюсь не переживу :D
                    +1
                    А вы, однако, хам :-)
                      –3
                      Высказал свое мнение что топик гавно — и даже это аргументировал. Ваше хамство с кармой и переходом на личности было не лучше =)
                      Как приятно чувствовать себя богом и вершить судьбы людей, чье мнение расходится с вашим, ни правда ли?
                        –1
                        >>Как приятно чувствовать себя богом и вершить судьбы людей
                        Возле тебя Наполеона нет? Дай ему что-то написать :-)
          +1
          о какой куче dll идет речь?
            –4
            Может там конечно и одна сборка, содержащая все эти чуда, что на первом рисунке, но все равно для одного логирования — зачем она мне нужна?
            Автор топика говорит что хочет обратить наше внимание на эту библиотеку — но я пока мотивов для этого еще не увидел
              +3
              не нравится — не ешь, зачем столько слов и усилий?
          +4
          EntLib — классная штука, но если брать аспект логирования, то мне больше по душе log4net logging.apache.org/log4net/index.html или NLog www.nlog-project.org/
            0
            Они полностью эквивалентны по возможностям (EntLib .vs. Log4Net), даже внутренняя архитектура в чем одинаковая. Просто тем, кто пользуется Enterprise Lib, можно не тащить левые сборки а остаться в «родном» фреймворке.

            Я тоже log4net юзаю. А через адаптеры Common.Logging вообще можно подключить любой из 3х логгеров, не меняя клиентский код
            +1
            Спасибо за статью. Пойдет, как введение в тему с картинками, чтобы заинтересовать темой и сподвигнуть на дальнейшие самостоятельные исследования. Такие статьи тоже нужны.

            По теме. Функционал у EL и конкретно блока логирования вполне развитый и удобный, но, как мне кажется, есть варианты и получше. В данном случае, log4net. Интересно, заинтересуют кого-нибудь статьи по Log4net?..

            Зато в исходниках EL можно почерпнуть немало хороших идей. Извлек оттуда, в частности, идею Exception Shielding'а.

            Неплохо бы в дальнейшем дать более полные описания идеологии и блоков EL.
              0
              >>идею Exception Shielding'а.

              это когда так, как ниже?
              ...
              } catch(Exception e) {
                  Log(e);
                  if( ExceptionPolicy.NeedToThrow(e)) throw;
              }


              Ужасно. Самое бестолковое и опасное, что есть в EntLib. Кроме как за поздним Policy Injection AB лучше туда и не заглядывать.
                +2
                Нет, оборачивание определенных исключений другими. Экранирование от потребителя требуемые типы исключений. Полезно, например, для серверных объектов, чтобы они не выкидывали клиенту исключения, которое он бы не смог десериализовать.
                  +1
                  А. Тогда ок :))
                  Кстати, такое лучше всего делать при помощи AOP.
                    0
                    Угу. Даже рассматривали такой вариант, не помню уже почему решили не использовать.
              +2
              Имхо, в EntLib самое прикольное это Unity AB, либо сам по себе либо в тандеме с PIAB. Для логирования использую log4net и PostSharp.
                0
                не далее как вчера обучал человека log4net-у. Имхо самая простая и в тоже время функциональная вещь.

                Only users with full accounts can post comments. Log in, please.