日志记录指南

事件日志代表系统和在系统上运行的应用程序存储重要事件的记录。 由于日志记录函数是常规用途,因此必须确定适合记录的信息。 通常,应仅记录可用于诊断硬件或软件问题的信息。 事件日志记录不应用作跟踪工具。

选择要记录的事件

下面是事件日志记录可能有用的情况示例:

  • 资源问题。 记录内存分配失败时的警告事件有助于指示内存不足情况的原因。
  • 硬件问题。 如果设备驱动程序遇到磁盘控制器超时、并行端口电源故障或网络或串行卡出现数据错误,则设备驱动程序可以记录有关这些事件的信息,以帮助系统管理员诊断硬件问题。
  • 坏扇区。 如果磁盘驱动程序遇到坏扇区,在重试操作后,它也许能够读取或写入扇区,但扇区最终会出错。 如果磁盘驱动程序可以继续,它应记录警告事件;否则,它应记录错误事件。 如果文件系统驱动程序发现大量坏扇区并修复它们,则记录警告事件可能有助于管理员确定磁盘可能即将失败。
  • 信息事件。 服务器应用程序 ((如数据库服务器) 记录用户登录、打开数据库或开始文件传输。 服务器还可以记录其他事件,例如错误 (无法访问文件、主机进程断开连接等) 、数据库损坏或文件传输是否成功。

写入消息

消息应该对尝试解决问题的管理员和用户有意义。 消息应包含了解导致问题的原因以及如何更正问题所需的所有信息。

避免写入诸如“从 I/O 子系统收到的驱动程序数据包无效”等神秘消息。 数据是数据包。”更好的消息将指示有问题的驱动程序正常运行,但记录了格式错误的数据包。 它可以继续说,需要 Unicode 版本的驱动程序来更正问题。 有关编写良好错误消息的详细信息,请参阅 错误消息指南

不要在消息文本中使用制表符或逗号,因为事件日志可以另存为逗号或制表符分隔的文本文件。 许多组织将这些文件导入数据库,额外的格式字符需要手动操作。

使用 UNC 名称或其他包含空格的链接时,请将名称括在尖括号中。 例如, <\\sharename\servername>。 可以将 URL 写入消息末尾,将用户指向相关帮助材料。 URL 必须是完全限定的 DNS 主机名。 例如,可以在消息中追加以下文本:“有关此消息的其他信息,请访问我们的支持站点:https://www.microsoft.com/Support/ProdRedirect/ContentSearch.asp."该链接将导致 ASP 页面,该页将用户重定向到与错误消息相关的内容。 它将分析 (单击 URL 时传递的其他参数,) 确定将用户重定向到何处。

传递给 ReportEvent 函数的参数将追加到 URL,如下所示:

strHTTPQuery += L"?EvtSrc=" + _strEscapedSource;
strHTTPQuery += L"&EvtCat=" + _strEscapedCategory;
strHTTPQuery += L"&EvtID=" + _strEscapedEventID;
strHTTPQuery += L"&EvtCatID=" + _strEscapedCategoryID;
strHTTPQuery += L"&EvtType=" + _strEscapedType;
strHTTPQuery += L"&EvtTypeID=" + _strEscapedTypeID;
strHTTPQuery += L"&EvtRptTime=" + _strEscapedDateAndTime;
strHTTPQuery += L"&EvtTZBias=" + _strEscapedTimeZoneBias;

如果事件源的消息 DLL 标头中的公司名称、产品名称、产品版本、文件名和文件版本有效,则它们也会追加到 URL 中:

ADD_VER_STR(L"CoName",   _strEscapedCompanyName);
ADD_VER_STR(L"ProdName", _strEscapedProductName);
ADD_VER_STR(L"ProdVer",  _strEscapedProductVersion);
ADD_VER_STR(L"FileName", _strEscapedFileName);
ADD_VER_STR(L"FileVer",  _strEscapedFileVersion);

减少开销

事件日志记录会消耗磁盘空间和处理器时间等资源。 事件日志所需的磁盘空间量和记录事件的应用程序的开销取决于选择记录的信息量。 这就是为什么只记录基本信息很重要的原因。 最好将事件日志记录调用置于代码中的错误路径中,而不是main代码路径中,这会降低性能。

每个事件日志记录所需的磁盘空间量包括 EVENTLOGRECORD 结构的成员。 这是一个可变长度结构;字符串和二进制数据存储在 结构之后。