事件日志文件格式

每个事件日志都包含一个由具有固定大小的 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填充。

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