日志记录准则

事件日志代表系统以及系统上运行的应用程序存储重要事件的记录。 由于日志记录功能是通用的,因此你必须决定记录哪些信息是合适的。 通常,应只记录对诊断硬件或软件问题有用的信息。 事件日志记录预期目标不是用作跟踪工具。

选择要记录的事件

以下是事件日志记录可能有所帮助的示例:

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

写入消息

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

避免编写诸如“从 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);

减少开销

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

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