Непреднамеренное событие трассировки ETW 254?

Я работаю над настройкой службы WCF, размещенной в службе Windows, которая использует трассировку событий для Windows (ETW) для ведения журнала. В настоящее время я просто сосредотачиваюсь на настройке фиктивной службы Windows с ETW, и я вижу, что в журнал записываются некоторые непреднамеренные события. В частности, всякий раз, когда я запускаю или останавливаю службу, я вижу событие с кодом операции 254 и без сообщения.

Я пытался искать в Интернете, но до сих пор я не нашел никаких ссылок на то, что это такое.

Если хотите попробовать, вот сервисный код:

Imports System.Threading

Public Class MyTestService

    Private _cts As CancellationTokenSource
    Private _workTask As Task = Nothing

    Private Class WorkState
        Public Property CancellationToken As CancellationToken
        Public Sub New(ByVal cancelToken As CancellationToken)
            Me.CancellationToken = cancelToken
        End Sub

    End Class

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Add code here to start your service. This method should set things
        ' in motion so your service can do its work.

        Debugger.Launch()

        _cts = New CancellationTokenSource()
        _workTask = Task.Factory.StartNew(AddressOf DoWork, New WorkState(_cts.Token), _cts.Token)
        _workTask.ContinueWith(AddressOf OnWorkDone)

        MyTestServiceEventSource.Log.OnServiceStarted()
    End Sub

    Private Sub OnWorkDone(parent As Task)
        If Not IsNothing(parent.Exception) Then
            MyTestServiceEventSource.Log.OnError(parent.Exception)
        End If
    End Sub

    Private Sub DoWork(ByVal obj As Object)
        Dim state = CType(obj, WorkState)

        While Not state.CancellationToken.IsCancellationRequested
            Threading.Thread.Sleep(5000)
            MyTestServiceEventSource.Log.OnTick()
        End While

    End Sub

    Protected Overrides Sub OnStop()
        ' Add code here to perform any tear-down necessary to stop your service.

        Try
            _cts.Cancel()
            _workTask.Wait(1500)
        Catch ex As Exception
            MyTestServiceEventSource.Log.OnError(ex)
        Finally
            _cts = Nothing
            _workTask = Nothing
        End Try

        MyTestServiceEventSource.Log.OnServiceStopped()
    End Sub

End Class

А вот и класс источника событий:

Imports System.Diagnostics.Tracing
Imports Newtonsoft

<EventSource(Name:="Company-MyTestService")>
Public Class MyTestServiceEventSource
    Inherits EventSource

#Region "Singleton Pattern"
    Private Shared _inst As New Lazy(Of MyTestServiceEventSource)(Function() New MyTestServiceEventSource())
    Public Shared ReadOnly Property Log As MyTestServiceEventSource
        Get
            Return _inst.Value
        End Get
    End Property

    Private Sub New()
        MyBase.New()
    End Sub
#End Region

    Public Class EventIds
        Public Const SERVICE_STARTED As Integer = 1
        Public Const SERVICE_STOPPPED As Integer = 2
        Public Const TICK_EVENT As Integer = 3
        Public Const ERROR_EVENT As Integer = 4
    End Class

    <[Event](EventIds.SERVICE_STARTED, Opcode:=EventOpcode.Start, Message:="MyTestService Started", Level:=EventLevel.Informational)>
    Public Sub OnServiceStarted()
        If IsEnabled() Then
            Me.WriteEvent(EventIds.SERVICE_STARTED)
        End If
    End Sub


    <[Event](EventIds.TICK_EVENT, Message:="MyTestService Tick", Level:=EventLevel.Verbose)>
    Public Sub OnTick()
        If IsEnabled() Then
            Me.WriteEvent(EventIds.TICK_EVENT)
        End If
    End Sub

    <[Event](EventIds.ERROR_EVENT, Message:="{0}", Level:=EventLevel.Error)>
    Public Sub OnError(ByVal errMsg As String, ByVal details As String)
        If IsEnabled() Then
            Me.WriteEvent(EventIds.ERROR_EVENT, errMsg, details)
        End If
    End Sub

    <NonEvent>
    Public Sub OnError(ByVal ex As Exception)
        Try
            Dim details = Json.JsonConvert.SerializeObject(ex)
            OnError(ex.Message, details)
        Catch ex2 As Exception
            Debugger.Break()
        End Try
    End Sub

    <[Event](EventIds.SERVICE_STOPPPED, Opcode:=EventOpcode.Stop, Message:="MyTestService Stopped", Level:=EventLevel.Informational)>
    Public Sub OnServiceStopped()
        If IsEnabled() Then
            Me.WriteEvent(EventIds.SERVICE_STOPPPED)
        End If
    End Sub



End Class

person iam1me    schedule 12.09.2018    source источник


Ответы (1)


Все поставщики ETW должны иметь манифест, в котором отображаются события поставщика. Это делается EventSource через событие ManifestData, которое вы видите.

Событие MSec= "16059,4211" PID="3444" PName="foo" TID="1776" ActivityID="ffd679657c475d357c32b8dbe608b3ff" EventName="ManifestData" ProviderName="FooEventSource" ProviderGuid= "GUID" ClassicProvider="False" ProcessorNumber="1" Opcode="254" >

person magicandre1981    schedule 13.09.2018
comment
Ага! Спасибо :) - person iam1me; 13.09.2018