命令行
EventCreate.exe
工具在注册表中注册一个用户定义的事件源,供Windows事件日志查看器使用,像这样:
eventcreate /t INFORMATION /ID 100 /L "Application" /SO [SourceName] /D "Description"
我写了一个应用程序,它有自己的事件日志资源字符串,并注册为事件源,per MSDN,但它不使用
CustomSource
值并且工作正常。
我无法在 MSDN 或在线其他地方找到任何关于
CustomSource
的确切含义的文档。我机器上的所有注册资源都没有使用它。
有谁知道
CustomSource
是什么意思,它是如何工作的?它只是 EventCreate.exe
内部的东西,还是 Windows 事件日志实际上将它用于某些事情?
感谢@RbMm 指出这篇博文:
EventCreate 和“错误:源参数仅用于识别自定义应用程序/脚本”
无论出于何种原因,EventCreate 仅设计用于记录与 EventCreate 创建的事件日志源相关联的事件。它通过在创建新源时在源的注册表项中添加一个名为
的 REG_DWORD 值并检查该值是否存在已存在的源来实现。所以在上面的例子中,如果应用程序日志中不存在“MyStuff”源,上面的命令会创建它并使用CustomSource
值配置它的键。在验证CustomSource
值的存在后,使用相同源对 EventCreate 的后续调用将成功。但是,如果“MyStuff”源是通过另一种没有创建 CustomSource 标志的机制创建的,例如使用 PowerShellCustomSource
cmdlet,那么您会收到错误消息。如果您在事件源的键中创建New-EventLog
值,则 EventCreate 将与该源一起使用。CustomSource
1 - 尝试使用代码创建源
代码应检查源代码,如果不存在则创建它。
示例代码(带 .NET 的 powershell):
$source = "MySource"
if (![System.Diagnostics.EventLog]::SourceExists($source)) {
[System.Diagnostics.EventLog]::CreateEventSource($source, 'Application')
}
[System.Diagnostics.EventLog]::WriteEntry($source, 'log message test', [System.Diagnostics.EventLogEntryType]::Information)
2 - 重启 PC/服务器
不太可能有帮助,但一个简单的选择。
3 - EventCreate CMD 工具
尝试使用命令行工具“eventcreate”来编写条目,它可能会让您更详细地了解问题:
eventcreate /T Information /ID 20 /L Application /SO PEI /D “Raymondcc Event for My Program” 错误:
eventcreate:错误:源参数仅用于识别自定义应用程序/脚本(未安装的应用程序)。 这意味着您不能添加到不是由 eventcreate 创建的源。这意味着源是在安装等过程中由应用程序创建的,你不应该尝试让它工作,而是选择一个新的源名称(或者根本没有)
4 - 验证注册表
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application
它说替换为您尝试使用的来源。如果您看到 EventMessageFile 设置为 C:\Windows\Microsoft.NET\Framework64 4.0.30319\EventLogMessages.dll 之类的内容,则没有问题。如果您看到类似 c:\program files\my program.exe 的应用程序路径,那么它将无法运行。
5 - 其他选项
有办法解决这个问题,但它很复杂。基本上,如果可能的话,最好只使用另一个源名称。如果密钥不是必需的,您可以复制它(例如复制 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application),然后删除它并查看从那时起使用 eventcreate 是否有任何问题。