事件日志文件格式

每个事件日志都包含一个标头(由 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 配置值或系统资源量的限制。

    达到事件日志大小限制后,可能会开始包装。 包装由 保留 配置值控制。 有关事件日志配置值的详细信息,请参阅 Eventlog 密钥

  • 包皮。 记录组织为循环缓冲区。 添加新记录时,将替换最早的记录。 最早和最新记录的位置将有所不同。 下面的示例演示包装方法。

    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。

有关详细信息和代码示例,请参阅 报告事件