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

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

Формат

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

  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            |
 +---+-+-+-----------------------+-------------------------------+

Sev

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

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."