Win7:从事件源注销事件日志
本文关键字:事件 日志 注销 事件源 Win7 | 更新日期: 2023-09-27 18:22:12
不久前,我学习了MSDN中关于如何编写windows服务的示例。它包括以下代码:
public Monitor_Processes()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("Monitor_Processes"))
{
System.Diagnostics.EventLog.CreateEventSource("Monitor_Processes", "Monitor_Processes_Log");
}
eventLog1.Source = "Monitor_Processes";
eventLog1.Log = "Monitor_Processes_Log";
}
它安装得还可以,但我在启动服务时遇到了一个错误。当我检查事件日志时,它说:"源‘Monitor_Processes’没有在日志‘Monitor_Processes_log’中注册。(它在日志‘Application’中注册了。)"
从那以后,我把代码改成了这样:
public Monitor_Processes()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("Monitor_Processes"))
{
System.Diagnostics.EventLog.CreateEventSource("Monitor_Processes", "");
}
eventLog1.Source = "Monitor_Processes";
}
但现在,即使在卸载和重新启动后,我在尝试启动服务时仍然会遇到同样的错误(错误消息仍然指向"Monitor_Processes_Log")。
如何重新启动并将我的源注册到应用程序日志中(假设届时我的服务将成功启动)?
您应该删除源
System.Diagnostics.EventLog.DeleteEventSource("Monitor_Processes");
顺便说一句,我建议您不要在执行服务期间尝试检查源是否存在并创建它。EventLog.SourceExists()方法在Windows 7和Windows Server 2008 R2上需要管理权限,因为它试图检查安全日志。您应该在ServiceInstaller类中添加这些检查/创建语句。
如果可能的话,不要让你的Windows服务需要本地管理员。
编辑:要手动创建事件日志源,也可以使用PowerShell。
param (
$logName = "Application",
$source = $(Read-Host -prompt "Enter EventLog source"),
$machineName = ".",
[switch]$verbose
)
function createEventSource() {
if (![System.Diagnostics.EventLog]::SourceExists($source, $machineName)) {
[System.Diagnostics.EventLog]::CreateEventSource($source, $logName, $machineName)
Write-VerboseHost "Created source $source in log $logName."
} else {
Write-VerboseHost "Source $source in log $logName already exists."
}
}
function help() {
"Usage: Create-EventSource -source string [-machineName string] [-verbose]"
exit
}
function Write-VerboseHost($message) {
if ($verbose) {
Write-Host $message
}
}
if (!$source) { help }