можно записать в журнал событий трассировки. Этот класс реализует абстрактный класс
TraceListener
.
Добавление регистрации событий
Если свойство
AutoLog
класса
ServiceBase
задано как true, то автоматически включается регистрация событий. Класс
ServiceBase
регистрирует информационное событие при запросах службы для запуска, остановки, паузы и продолжения. В классе
ServiceInstaller
создается экземпляр
EventLogInstaller
, чтобы сконфигурировать источник журнала событий. Этот источник журнала событий имеет такое же имя, как и служба. Для записи события используем статический метод
WriteEntry
класса
EventLog
. Свойство
Source
было уже задано в классе
ServiceBase
:
EventLog.WriteEntry("event log message");
Этот метод регистрирует информационное событие. Если должно быть создано событие предупреждения или ошибки, то для определения этого типа используется перезагруженный метод
Добавление регистрации событий в другие типы приложений
Для служб класс
ServiceBase
автоматически добавляет свойства регистрации событий. Если желательно использовать регистрацию событий в других типах приложений, это легко делается с помощью Visual Studio.NET.
□ Используйте ToolBox для добавления компонента
EventLog
в конструктор.
□ Задайте свойство
Log
компонента
EventLog
как
Application
, а свойство
Source
как выбранное имя. Обычно это бывает имя приложения, которое показано в Event View.
□ Теперь можно записать журналы с помощью метода
WriteEntry
экземпляра
EventLog
.
□ Можно добавить программу установки из пункта контекстного меню Add Installer компонента
EventLog
. Это создает класс
ProjectInstaller
, который конфигурирует источник событий в реестре.
□ С помощью команды
installutil
теперь можно зафиксировать приложение,
installutil
вызывает класс
ProjectInstaller
и регистрирует источник событий.
Для установки типа хсору последние два шага на самом деле не нужны. Если задано свойство
Source
экземпляра
EventLog
, источник автоматически регистрируется, когда журнал событий заполняется в первый раз. Это действительно легко сделать, но для реального приложения предпочтительнее добавить программу установки: с помощью
installutil /u
конфигурация регистрации событий отменяется. Если приложение просто удаляется, этот ключ реестра остается, если не будет вызван метод
EventLog.DeleteEventSource
.
Трассировка
Можно сделать так, чтобы все сообщения трассировки направлялись
в журнал событий. На самом деле это не нужно, так как в нормально работающей системе журнал событий будет перегружен сообщениями трассировки. Системный администратор пропустит действительно важные записи, если это произойдет. Помните, что тип записи события — это ошибка, предупреждение и информационное. При этом информационные сообщения редко являются информацией об успехе. Включение трассировочных сообщений в журнал событий может быть полезным свойством для тестирования проблемных служб. Трассировка возможна как с отладочным, так и с окончательным кодом.
Чтобы послать трассировочные сообщения в журнал событий, должен быть создан объект
EventLogTraceListener
и добавлен в список приемника класса
Trace
:
EventLogTraceListener listener = new EventLogTraceListener(eventLog1);
Trace.Listeners.Add(listener);
Теперь все трассировочные сообщения посылаются в журнал событий:
Trace.WriteLine("trace message");
Дополнительная информация о методах трассировки находится в главе 6.
Создание приемника событий
Теперь было бы полезно создать приложение, которое получает событие, когда в службе происходит что-то плохое. Мы создадим простое оконное приложение, отслеживающее события службы
Quote
:
Оконное приложение имеет только окно списка и кнопку выхода:
Компонент
EventLog
добавляется в этот проект перетаскиванием его из панели инструментов. Свойство
Log
задается как
Application
, a
Source
как источник службы
QuoteService
. Класс
EventLog
также имеет свойство
EnableRaisingEvents
. До сих пор мы не говорили об этом свойстве. По умолчанию для него используется значение false, задание его как true означает, что событие создается каждый раз, когда происходит это событие, и можно написать обработчик событий для оконного события
EntryWritten
.
В файле
EventListener.cs
свойства задаются в методе
InitializeComponent
:
private void InitializeComponent {
this.eventLogQuote = new System.Diagnostics.EventLog;
this.buttonExit = new System.Windows.Forms.Button;
this.listBoxEvents = new System.Windows.Forms.ListBox;
((System.ComponentModel.ISupportInitialize)
(this.eventLogQuote)).BeginInit;
this.SuspendLayout;
//
// eventLogQuote
//
this.eventLogQuote.EnableRaisingEvents = true;
this.eventLogQuote.Log = "Application";
this.eventLogQuote.Source = "QuoteService";
this.eventLogQuote.SynchronizingObject = this;
this.eventLogQuote.EntryWritten +=
new System.Diagnostics.EntryWrittenEventHandler(this.OnEntryWritten);