Windows服务无法写入事件日志

时间:2014-09-14 01:43:26

标签: vb.net windows-services

我创建了以下报表服务但是我无法在EventLog中记录任何内容。在项目设置中,我将应用类型设置为Windows服务和启动项目为SUB Main ...任何人都可以建议代码有什么错误

Program.vb

Imports System.ServiceProcess

    Namespace ReportingService

    Public Class Program
        Private Sub New()
        End Sub
        ''' <summary>The main entry point for the application.</summary>
        Private Shared Sub Main(args As String())
            Dim ServicesToRun As ServiceBase()
            ServicesToRun = New ServiceBase() {
                New ReportingImmediate()
            }
            ServiceBase.Run(ServicesToRun)
        End Sub
    End Class
End Namespace

ReportService.vb

Imports System.ServiceProcess
Imports System.Timers
Imports System.Configuration

Public Class ReportingImmediate
    Inherits ServiceBase

#Region "Members"

    Private ReadOnly time As Timer
    Private ReadOnly rptHelper As ReportingHelper
    Private ReadOnly timeInterval As String

#End Region

    Public Sub New()
        ' Initialize Logs
        InitializeComponent()
        ' Initialize other components
        time = New Timer()
        timeInterval = ConfigurationManager.AppSettings("ImmediateReRunInterval") '10000
        time.Interval = Integer.Parse(timeInterval)
        AddHandler time.Elapsed, AddressOf TimeElapsed

        rptHelper = New ReportingHelper()
    End Sub

#Region "Timer Event"

    ''' <summary>time Elapsed</summary>
    ''' <param name="sender">The object that raised the event sender</param>
    ''' <param name="e">Event data passed to the handler e</param>
    Private Sub TimeElapsed(sender As Object, e As ElapsedEventArgs)
        time.Enabled = False

        rptHelper.WriteToEventLog("Logging Report Service")

        ' Enable the Timer
        time.Enabled = True
        time.Interval = Integer.Parse(timeInterval)
    End Sub

#End Region

#Region "Service Events"

    ''' <summary>On Start</summary>
    ''' <param name="args">Arguments</param>
    Protected Overrides Sub OnStart(args As String())
        time.Enabled = True
    End Sub

    ''' <summary>On Stop</summary>
    Protected Overrides Sub OnStop()
        time.Enabled = False
    End Sub

#End Region

End Class

ReportHelper.vb

    Imports System.Data.OleDb
    Imports System.Configuration
    Imports System.Threading.Tasks
    Imports System.IO
    Imports System.IO.Packaging
    Imports System.Text
    Imports System.Net.Mail
    Imports System.Net

    Public Class ReportingHelper

        Public Function WriteToEventLog(ByVal entry As String, Optional ByVal appName As String = "ReportingService", Optional ByVal eventType As  _
                            EventLogEntryType = EventLogEntryType.Information, Optional ByVal logName As String = "RepotingServiceImmediate") As Boolean

        Dim objEventLog As New EventLog

        Try

            'Register the Application as an Event Source
            If Not EventLog.SourceExists(appName) Then
                EventLog.CreateEventSource(appName, logName)
            End If

            'log the entry
            objEventLog.Source = appName
            objEventLog.WriteEntry(entry, eventType)

            Return True

        Catch Ex As Exception

            Return False

        End Try

    End Function
End Class

1 个答案:

答案 0 :(得分:2)

您的服务将无法EventLog.CreateEventSource,因为它不以管理员身份运行(参见EventLog.CreateEventSource Method的备注部分中的注释):

  

要在Windows Vista及更高版本或Windows Server 2003中创建事件源,您必须具有管理权限。

     

此要求的原因是必须搜索所有事件日志(包括安全性)以确定事件源是否唯一。从Windows Vista开始,用户无权访问安全日志;因此,抛出SecurityException。

由于您不应该以管理员身份运行服务,因此解决方案是编写一个以管理员权限运行的小程序来创建事件源。

Try...Catch中的DWPReportingHelper.WriteToEventLog可能隐藏了您的错误。