Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows事件日志中没有类别_C++_Windows_Logging_Event Log - Fatal编程技术网

C++ Windows事件日志中没有类别

C++ Windows事件日志中没有类别,c++,windows,logging,event-log,C++,Windows,Logging,Event Log,我已为事件记录器创建了一个类别文件,但类别名称不会显示在事件记录器中 但是,如果从C:\Windows\System32\winevt\Logs打开日志,则会显示类别名称。如果使用以下PowerShell,类别名称也会显示 $eventlog = New-Object System.Diagnostics.EventLog("MyLog") Write-Host $eventlog.Entries[0].Category .mc文件如下所示: MessageIdTypedef = WORD

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

但是,如果从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"
我发现了同样的问题,但没有答案

我在Windows7、8和WindowsServer2008R2上都试过这个

编辑


我创建了一个测试项目来展示我所做的工作。下载

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

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

可能会提示您关闭其他服务。您必须输入
Y
才能继续。正在关闭的服务通常会自行重新启动,因此您只需等待几秒钟。事件日志服务可能无法关闭,因为另一个服务已重新启动,可能需要几次尝试才能关闭所有内容。密切关注结果文本的状态

我在将源注册表信息指向VS项目中的邮件文件夹时遇到了同样的问题。我发现它是在我与管理员用户创建了一个
C:\Test
文件夹并引用该文件夹后开始工作的。此文件夹与项目文件夹之间的唯一区别是两个组。把这两个小组中的任何一个加起来,事情就顺利了。把它们都从任何一个文件夹中取出来都会使它停止


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

另一种可能性,尽管显然不是OP的问题(或语言),当
EventMessageFile
CategoryMessageFile
具有重叠的
MessageId
时,会出现类似的症状。我假设在查看“实时”源时,这是事件日志查看器实用程序中的一个错误,因为在使用powershell.NET或直接在事件查看器中打开事件日志文件以解析事件日志时,症状不存在

在我的情况下,我有一个.NET应用程序,正在使用.NET API创建事件源,使用
EventSourceCreationData
指定
CategoryResourceFile
CategoryCount
。默认情况下,
MessageResourceFile
将设置为
C:\Windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll
。这些API的作用导致创建
CategoryMessageFile
CategoryCount
EventMessageFile
。这里需要注意的重要一点是,.NET的消息文件有助于将所有定义为
%1\r\n\x00
的消息从0x0添加到0x000FFFF-本质上是指当您以默认方式创建事件消息时,使用可以查看记录的字符串消息,而不考虑事件id。如果改为使用,您几乎需要使用一个专门的消息文件(参见类中的文档)

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

因此,例如,如果您指定了类别id 8,并且希望使用本地化的类别名称“My category”,则事件查看器可以显示以下三项之一:
(8)
,这意味着
CategoryMessageFile
CategoryCount
注册表项配置错误或dll存在问题<代码>我的类别如果一切正常<代码>8如果您遇到了我正在描述的问题

多亏了里奇·谢勒的回答。问题不是从
CategoryMessageFile
获取类别字符串,而是从
MessageResourceFile
获取类别字符串。由于.NET资源文件只是返回源数据第一个元素的格式化字符串,因此生成了数字类别id

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

遗憾的是,我找不到Windows事件查看器中的任何未解决问题-我看到它在Windows 10 buil中被破坏