前段时间我跟着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”) - 即使在卸载和重新启动之后也是如此。
如何重新开始并将我的源注册到应用程序日志(假设我的服务将成功启动)?
答案 0 :(得分:1)
您应该删除源
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 }