【问题标题】:The Source and Log properties must be matchedSource 和 Log 属性必须匹配
【发布时间】:2020-12-17 13:42:20
【问题描述】:

当我尝试启动服务时,出现以下错误:

服务无法启动。 System.ArgumentException:源“Bar 源”未在日志“Bar2”中注册。 (这是 已在日志“条源”中注册。)“源和日志属性 必须匹配,或者你可以将 Log 设置为空字符串,它会 自动匹配到 Source 属性。 在 System.Diagnostics.EventLogInternal.VerifyAndCreateSource(字符串 源名称,字符串当前机器名称) 在 System.Diagnostics.EventLogInternal.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] 原始数据) 在 System.Diagnostics.EventLog.WriteEntry(字符串消息) 在 C:\Program Files (x86)\Bar 中的 Bar.Service1.writeToLog(String msg) - 用于 APPS\Service1.vb:line 292 在 C:\Program Files (x86)\Bar 中的 Bar.Service1.OnStart(String[] args) - 用于 APPS\Service1.vb:line 37 在 System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(对象 州)

有谁知道是什么导致了这个问题?我在代码中没有提到Bar2,程序文件中的文件夹名为“Bar2”,但我将其更改为“Bar”。

请指教!

这是WriteToLog 函数:

Private Sub writeToLog(ByVal msg As String)
    Dim evtLog As New EventLog
    If Not Diagnostics.EventLog.SourceExists("Bar") Then
        Diagnostics.EventLog.CreateEventSource("Bar", "Log of Bar")
    End If
    evtLog.Source = "Bar"
    evtLog.Log = "Log of Bar"
    evtLog.WriteEntry(msg)
End Sub

【问题讨论】:

  • 尝试将Dim evtLog As New EventLog移到if语句后看看是否有帮助?

标签: .net


【解决方案1】:

日志属性存储事件日志的名称,如在控制面板 > 管理工具 > 事件查看器小程序中可见。大多数应用程序会记录到 Windows 日志 > 应用程序日志,这是您未分配 Log 属性时的默认设置。但您可以为自己的应用创建自定义日志,在“应用程序和服务日志”条目下可见。

此信息在您首次使用 CreateEventSource 创建日志时记录在注册表中。 Log 属性必须在将来匹配,如果不是,那么您会收到此异常。因此,您知道该日志实际上已经存在,但您曾经使用不同的日志名称“Bar2”创建它。可能认为这不是一个很好的名称并更改了 Log 属性。卡布姆。

将 Log 属性设置为空字符串不是一种解决方法。它将继续以原始日志名称登录,使用注册表查找其名称。您可以使用 Regedit.exe 修复不需要的注册,导航到 HKLM\SYSTEM\CurrentControlSet\Services\EventLog。如果您删除该条目,那么您还应该删除相应的 .evtx 文件,File 值会为您提供其路径名。

【讨论】:

  • 谢谢你的解释清楚,但是这种情况下我没关系,它会继续登录到原来的日志名。
  • 嗯,这对任何发现这个问题的人来说都应该是个大问题。
  • 我完全同意:) 我刚刚提到它是为了解释为什么我没有将其标记为答案。
  • 我长期面临同样的问题。从注册表中删除条目只能解决我的问题。
  • 我的条目在删除后的下一次运行中不断重新创建。它没有文件值供我跟踪和删除 .evtx,但是应用程序条目确实存在,我在同一个地方找到了我的 .evtx 文件。对我来说,它是 %SystemRoot%\system32\winevt\Logs\,我必须先停止 Windows 事件服务,然后才能将其删除。
【解决方案2】:

将日志保留为空字符串解决了错误:

Private Sub writeToLog(ByVal msg As String)
    Dim evtLog As New EventLog
    If Not Diagnostics.EventLog.SourceExists("Bar") Then
        Diagnostics.EventLog.CreateEventSource("Bar", "")
    End If
    evtLog.Source = "Bar"
    evtLog.Log = ""
    evtLog.WriteEntry(msg)
End Sub

【讨论】:

    【解决方案3】:

    在我的例子中,我将一个名为“P5-RUN Analytics LOG”的日志分配给名为“FSSH P5-RUN Analytics”的服务。

    不工作: 公共子 New()

        ' This call is required by the designer.
        InitializeComponent()
    
        Try
            If Not System.Diagnostics.EventLog.SourceExists("FSSH P5-RUN Analytics") Then
                System.Diagnostics.EventLog.CreateEventSource("FSSH P5-RUN Analytics", "P5-RUN Analytics Log")
            End If
    
            EventLog1.Source = "FSSH P5-RUN Analytics"
            EventLog1.Log = "P5-RUN Analytics Log"
        Catch ex As Exception
    
        End Try
    
    End Sub 
    

    工作:

    公共订阅New()

        ' This call is required by the designer.
        InitializeComponent()
    
        Try
            If Not System.Diagnostics.EventLog.SourceExists("P5-RUN Analytics") Then
                System.Diagnostics.EventLog.CreateEventSource("P5-RUN Analytics", "P5-RUN Analytics Log")
            End If
    
            EventLog1.Source = "P5-RUN Analytics"
            EventLog1.Log = "P5-RUN Analytics Log"
        Catch ex As Exception
    
        End Try
    
    End Sub
    

    一旦我使服务的前六个字符和日志匹配,它就正确安装并像魅力一样工作。如果前几个字符不同步(或重复?),它会从其他一些关于服务冲突的文章中敲响警钟,但我不记得那篇文章是在哪里发布的。

    最后,一旦我对我的服务和日志名称进行了更改,我在重新安装我的服务之前从 HKLM\SYSTEM\CurrentControlSet\Service\EventLog 的注册表中清除了旧的服务/日志名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2015-09-01
      • 2011-04-03
      相关资源
      最近更新 更多