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