【问题标题】:No categories in Windows Event LogWindows 事件日志中没有类别
【发布时间】:2015-05-15 17:53:55
【问题描述】:

我已经为事件记录器创建了一个类别文件,但类别名称没有显示在事件记录器中。

如果我从 C:\Windows\System32\winevt\Logs 打开日志,则会显示类别名称。如果我使用以下 PowerShell,也会显示类别名称。

$eventlog = New-Object System.Diagnostics.EventLog("MyLog")
Write-Host $eventlog.Entries[0].Category

.mc 文件如下所示:

MessageIdTypedef = WORD

LanguageNames=(
    English=0x0409:MSG00409
    Swedish=0x041D:MSG0041D
)

MessageId=1
SymbolicName=CAT_1
Language=English
Category 1
.
Language=Swedish
Kategori 1
.

MessageId=2
SymbolicName=CAT_2
Language=English
Category 2
.
Language=Swedish
Kattegori 2
.

; // Up to 22 categorys

在注册表中,我有以下内容:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\MyLog\MySource]
"CategoryCount"=dword:00000016
"TypesSupported"=dword:00000007
"CategoryMessageFile"="C:\\path\\Messages.dll"

我发现https://social.msdn.microsoft.com/forums/windowsdesktop/en-us/3fed3069-ce0f-4168-8132-4d19d66fdd7e/windows-7eventlog-creating-custom-categories有同样的问题,但没有解决问题。

我已在 Windows 7、8 和 Windows Server 2008 R2 中尝试过此操作

编辑

我创建了一个测试项目来展示我所做的事情。下载它here

【问题讨论】:

  • 请不要混淆“C:\\path\\Messages.dll”,显示实际路径。
  • 现在 Messages.dll 位于解决方案的调试文件夹中。但我也尝试将其移至 C:\Messages.dll。和文件在文件系统中所在的函数有关系吗?
  • 我创建了一个测试项目。在我的问题中最后查看我的编辑。
  • @magol 有关信息,将 DLL 移动到“Program Files (x86)”的子文件夹中(如下 Rich 所建议的)解决了我的问题。
  • 这可能是因为非英语系统上的 Wevtsvc.dll 中的错误吗?曾经有一个修补程序 2772695 - 我不确定它是否已更新 - 我仍然在德语 Windows 7 操作系统上看到此问题(与英语 Windows 7 操作系统相反),并且 Wevtsvc.dll 较旧比修补程序信息中提到的那个。

标签: c++ windows logging event-log


【解决方案1】:

尝试将机器的Authenticated UsersUsers 组添加到邮件文件夹的安全级别。保留默认权限。然后重新启动或尝试重新启动 EventLog 服务。

在管理员命令提示符下:net stop eventlog

系统可能会提示您关闭其他服务。您必须输入 Y 才能继续。被关闭的服务通常会自行重启,因此您只需等待几秒钟。 eventlog 服务可能无法关闭,因为另一个服务已重新启动,可能需要几次尝试才能使所有内容都关闭。密切关注生成的文本以了解状态。

我在将源注册表信息指向我的 VS 项目中的消息文件夹时遇到了同样的问题。我发现它在我使用管理员用户创建了一个 C:\Test 文件夹并改为引用它之后开始工作。这个和项目文件夹之间的唯一区别是两个组。添加两个组中的任何一个都可以使事情正常进行。将它们从任一文件夹中取出使其停止。

我还发现,如果我的 CategoryMessageFileEventMessageFile 中有匹配的 MessageId,它会忽略 CategoryMessageFile

【讨论】:

  • 你是最棒的!我将CategoryMessageFile 移动到“程序文件”中的文件夹,然后 BAM,我现在在类别列的事件查看器中看到文本,而不是臭名昭著的 (n) 谢谢!
【解决方案2】:

EventMessageFileCategoryMessageFile 重叠MessageIds 时,另一种可能,虽然显然不是OP 的问题(或语言),但表现出类似的症状。我假设这是查看“实时”源时事件日志查看器实用程序中的错误,因为在使用 powershell、.NET 或直接在事件查看器中打开事件日志文件以解析事件日志时症状不存在.

在我的情况下,我有一个 .NET 应用程序并使用 .NET API 创建事件源,使用 EventSourceCreationData 指定 CategoryResourceFileCategoryCount。默认情况下,MessageResourceFile 将设置为 C:\Windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll。这些 API 的影响导致创建 appropriate registry keysCategoryMessageFileCategoryCountEventMessageFile。这里需要注意的重要一点是来自 .NET 的消息文件有助于添加从 0x0 到 0x000FFFF 的消息,这些消息都定义为 %1\r\n\x00 - 本质上意味着当您以默认方式创建事件消息时,使用 EventLog.WriteEntry 您会看到字符串消息无论事件 ID 为何,都已记录。如果改为使用EventLog.WriteEvent,则几乎需要使用专门的消息文件(请参阅EventInstance 类的文档)。 More Info

症状是在查看实时事件查看器时,使用传递到事件日志的 MessageId 定义的类别显示为整数而不是资源文件中的字符串。请注意,如果您错误配置了类别资源文件、权限问题等,这与您将“任务类别”视为整数但在括号中的行为不同。

例如,如果您指定类别 id 8 并期望本地化类别名称“我的类别”,则事件查看器可以显示以下三项之一:(8) 表示 CategoryMessageFileCategoryCount 注册表项配置错误或者dll有问题。 My Category 如果一切都按预期工作。 8 如果您遇到我描述的问题。

感谢 Rich Shealer 对指针的回答。问题不是像人们期望的那样从CategoryMessageFile 中获取类别字符串,而是从MessageResourceFile 中获取它——并且由于.NET 资源文件只是一个返回源数据第一个元素的格式化字符串生成数字类别 ID。

没有“好的”解决方法,但在我使用通过日志框架和一些过滤提供的元数据来记录消息的用例中,消息的类别和事件 ID 通常为零,除非我要专门设置记录一小部分日志消息时的一个。这意味着日志框架是调用 API 来写入日志条目的东西。一种解决方法是在 .mc 文件中将 0x0 的 MessageId 声明为 %1,并且仅以高于您期望的类别数的数字开始您的事件 id。然后在注册表中或通过属性MessageResourceFile 配置EventMessageFile 以首先指定类别文件,分号分隔符,然后是.NET 默认资源文件。这将正确显示和记录事件 id 和类别 id 为 0 的消息,并且对于大于您的类别文件的事件 id 与您之前的行为相同。但是,任何定义了与类别冲突的数字的 eventid - 好吧,您将类别名称作为日志消息。您也可以删除消息资源文件,但随后会收到烦人的“找不到资源”消息。我确认了这里的行为,但拒绝这样做 - 将忍受丢失的文本,因为我主要使用 API 进行分析,并且在那里它是正确的。

遗憾的是,我无法找到 Windows 事件查看器的任何未解决问题 - 我发现它在 Windows 10 build 1909 中已损坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多