Формат файла журнала событий
Каждый журнал событий содержит заголовок (представленный структурой ELF_LOGFILE_HEADER ), имеющий фиксированный размер, за которым следует переменное количество записей событий (представленных структурами EVENTLOGRECORD ) и запись конца файла (представленная структурой ELF_EOF_RECORD ).
Структура ELF_LOGFILE_HEADER и структура ELF_EOF_RECORD записываются в журнал событий при создании журнала событий и обновляются при каждой записи события в журнал.
Когда приложение вызывает функцию ReportEvent для записи записи в журнал событий, система передает параметры в службу ведения журнала событий. Служба ведения журнала событий использует эти сведения для записи структуры EVENTLOGRECORD в журнал событий. Этот процесс представлен на схеме ниже.
Записи событий упорядочены одним из следующих способов:
Без упаковки. Самая старая запись — сразу после заголовка журнала событий, а новые записи добавляются после последней добавленной записи (до ELF_EOF_RECORD). В следующем примере показан метод без оболочки:
HEADER (ELF_LOGFILE_HEADER) EVENT RECORD 1 (EVENTLOGRECORD) EVENT RECORD 2 (EVENTLOGRECORD) EOF RECORD (ELF_EOF_RECORD)
Не-оболочка может возникать при создании журнала событий или при очистке журнала событий. Журнал событий по-прежнему не является оболочкой, пока не будет достигнут предельный размер журнала событий. Размер журнала событий ограничен значением конфигурации MaxSize или объемом системных ресурсов.
При достижении предельного размера журнала событий может начаться перенос. Упаковка управляется значением конфигурации хранения . Дополнительные сведения о значениях конфигурации журнала событий см. в разделе Ключ журнала событий.
Упаковка. Записи организованы в виде кругового буфера. При добавлении новых записей заменяются самые старые. Расположение самых старых и новейших записей будет отличаться. В следующем примере показан метод упаковки.
HEADER (ELF_LOGFILE_HEADER) Part of EVENT RECORD 300 (EVENTLOGRECORD) EVENT RECORD 301 (EVENTLOGRECORD) . . . EVENT RECORD 400 (EVENTLOGRECORD) EOF RECORD (ELF_EOF_RECORD) Wasted space EVENT RECORD 102 (EVENTLOGRECORD) EVENT RECORD 103 (EVENTLOGRECORD) . . . EVENT RECORD 299 (EVENTLOGRECORD) Part of EVENT RECORD 300 (EVENTLOGRECORD)
В этом примере самая старая запись больше не 1, а 102, так как пробел для записей с 1 по 101 был перезаписан.
Между ELF_EOF_RECORD и самой старой записью есть некоторое пространство, так как система стерет целое количество записей, чтобы освободить место для последней записи. Например, если последняя запись имеет длину 100 байт, а две самые старые записи имеют длину 75 байт, система удалит две самые старые записи. Дополнительные 50 байт будут использоваться позже при записи новых записей.
Файл журнала событий имеет фиксированный размер, и когда записи в оболочке файла, запись в конце файла обычно разбивается на две записи. Например, если позиция для следующей записи составляет 100 байт от конца файла, а размер записи составляет 300 байт, первые 100 байт будут записаны в конце файла, а следующие 200 байт — в начале файла сразу после ELF_LOGFILE_HEADER. Если доступное пространство в конце файла меньше фиксированной части EVENTLOGRECORD (0x38 байт), то вся новая запись будет записана в начале файла сразу после ELF_LOGFILE_HEADER. Неиспользуемые байты в конце файла будут заполнены шаблоном 0x00000027.
Дополнительные сведения и пример кода см. в разделе Создание отчетов о событии.