Поделиться через


Идентификаторы событий (ведение журнала событий)

Идентификаторы событий однозначно определяют определенное событие. Каждый источник событий может определять собственные нумерованные события и строки описания, с которыми они сопоставляются в файле сообщения. Средства просмотра событий могут представлять эти строки пользователю. Они должны помочь пользователю понять, что пошло не так, и предложить какие действия следует предпринять. Направляйте описание на пользователей, решающих свои собственные проблемы, а не на администраторах или технической поддержке. Дополнительные сведения см. в руководства по сообщению об ошибке.

Формат

На следующей схеме показан формат идентификатора события.

  3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 +---+-+-+-----------------------+-------------------------------+
 |Sev|C|R|     Facility          |               Code            |
 +---+-+-+-----------------------+-------------------------------+

Сев

Суровость. Серьезность определяется следующим образом:

00 — успех
01 — информационные
10 — предупреждение
11 — ошибка

C

Бит клиента. Этот бит определяется следующим образом:

0 — системный код
1 . Код клиента

R

Зарезервированный бит.

объект

Код объекта. Это значение может быть FACILITY_NULL.

код

Код состояния для объекта.

Определения сообщений

Сообщения определяются в файле сообщения о событии. Строки описания в файле сообщения о событии индексируются идентификатором события, что позволяет средству просмотра событий отображать текст для любого события на основе идентификатора события. Все описания локализованы и зависят от языка. Дополнительные сведения о создании файла сообщения см. в текстовых файлов сообщений.

Строки описания могут содержать заполнители строк вставки, формы %n, где %1 указывает первую строку вставки и т. д. Например, ниже приведен пример записи в MC-файле:

MessageId=0x4
Severity=Error
Facility=System
SymbolicName=MSG_CMD_DELETE
Language=English
File %1 contains %2, which is in error.
.

В этом случае буфер, возвращаемый ReadEventLog содержит строки вставки. Элемент NumStrings в структуре EVENTLOGRECORD указывает количество строк вставки. Элемент stringOffset eventLOGRECORD указывает расположение первой строки вставки в буфере. Массив DWORD_PTRs, указывающий на адрес каждой строки в буфере при вызове функции FormatMessage, и она вставляет строки в сообщение.

Строка описания также может содержать заполнители для строк параметров из файла сообщения параметра. Заполнители имеют форму %%n, где %%1 заменяется строкой параметров идентификатором 1 и т. д. Однако для вставки строк параметров в строку сообщения, которая возвращает FormatMessage. Как правило, вызывается FormatMessage, чтобы получить строку сообщения для события. Затем вы анализируете строку сообщения для параметров %%n. Если сообщение содержит один или несколько параметров, загрузите значение реестра ParameterMessageFile для источника. Для каждого параметра в строке сообщения получите идентификатор и передайте его в FormatMessage, чтобы получить строку параметра. Замените параметр в строке сообщения строкой параметров, возвращаемой FormatMessage.

Строки вставки

Строки вставки — это необязательные строки, независимые от языка, используемые для заполнения значений заполнителей в строках описания. Так как строки не локализованы, важно использовать эти заполнители только для представления строк, независимых от языка, таких как числовые значения, имена файлов, имена пользователей и т. д. Длина строки не должна превышать 32 килобайта – 1 символов.

Избегайте использования нескольких строк для создания более крупного описания. Строка вставки должна рассматриваться как данные, а не текст. Например, в следующем примере pszString1 и pszString2 не следует использовать в качестве строк вставки для pszDescription.

LPSTR pszString1 = "successfully"; 
LPSTR pszString2 = "not"; 
LPSTR pszDescription = "The user was %1 added to the database.";

В следующем примере необходимо использовать pszString1 или pszString2 для строки вставки в pszDescription.

LPSTR pszString1 = "c:\\testapp1.c"; 
LPSTR pszString2 = "c:\\testapp2.c"; 
LPSTR pszDescription = "Access denied. Attempted to open the file %1."