Идентификаторы событий (ведение журнала событий)
Идентификаторы событий однозначно определяют определенное событие. Каждый источник событий может определять собственные нумерованные события и строки описания, с которыми они сопоставляются в файле сообщения. Средства просмотра событий могут представлять эти строки пользователю. Они должны помочь пользователю понять, что пошло не так, и предложить какие действия следует предпринять. Направляйте описание на пользователей, решающих свои собственные проблемы, а не на администраторах или технической поддержке. Дополнительные сведения см. в руководства по сообщению об ошибке.
Формат
На следующей схеме показан формат идентификатора события.
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."