事件源/企业库日志记录缓存已删除的方法(可能在一个InstrumentationManifest中!)

7

简短版

如果我改变这个...

EventSource(Name="BasicLogger")
public class BasicLogger : EventSource { ... }

到这个...

EventSource(Name="HardymanDatabaseLog")
public class BasicLogger : EventSource { ... }

我仍然收到日志消息,但它们已经损坏。
要么这些消息没有到达,要么它们被一种缺失/删除/移除的方法格式化,而这种方法甚至不存在于我的当前项目中!

由于某种未知原因,特定字符串“HardymanDatabaseLog”存在问题。

我认为这可能是由于损坏的仪器清单在某个地方显现造成的。

继续阅读以了解更多信息...!(谢谢:o)


长篇版本(附图片)

我有一个简单的控制台应用程序,通过nuget包引用EnterpriseLibrary.SemanticLogging

使用这里的示例代码,我添加了一个BasicLogger类。

当我运行我的简单应用程序时...

using System.ComponentModel;
using System.Diagnostics.Tracing;

namespace Etw
{
    class Program
    {
        static void Main(string[] args)
        {
            BasicLogger.Log.Error("Hello1");
            BasicLogger.Log.Critical("Hello2");
        }
    }
    [EventSource(Name = "BasicLogger")]
    public class BasicLogger : EventSource
    {
        public static readonly BasicLogger Log = new BasicLogger();

        [Event(1, Message = "{0}", Level = EventLevel.Critical)]
        public void Critical(string message)
        { if (IsEnabled()) WriteEvent(1, message); }

        [Event(2, Message = "{0}", Level = EventLevel.Error)]
        public void Error(string message)
        { if (IsEnabled()) WriteEvent(2, message); }

        [Event(3, Message = "{0}", Level = EventLevel.Warning)]
        public void Warning(string message)
        { if (IsEnabled()) WriteEvent(3, message); }

        [Event(4, Message = "{0}", Level = EventLevel.Informational)]
        public void Informational(string message)
        { if (IsEnabled()) WriteEvent(4, message); }
    }
}

我在日志查看器控制台(SemanticLogging-svc.exe)中获得以下响应:

Good Log

......这是正确的!

但是,如果我现在更新 EventSource 属性为 [EventSource(Name =“ HardymanDatabaseLog”)] ,并调整我的 SemanticLogging-svc.xml 以引用 HardymanDatabaseLog ......

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns="http://schemas.microsoft.com/practices/2013/entlib/semanticlogging/etw" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.microsoft.com/practices/2013/entlib/semanticlogging/etw SemanticLogging-svc.xsd">

  <sinks>
    <consoleSink name="ConsoleEventSink">
      <sources>
        <eventSource name="HardymanDatabaseLog" level="LogAlways"  />
      </sources>
      <eventTextFormatter header="+=========================================+"/>
    </consoleSink>
  </sinks>

</configuration>

如果我在日志查看器控制台中看到以下响应...

Bad Log

...不仅丢失了第一条消息,而且破坏了第二条!

如果您仔细观察以 EventId : 1 开头的行,那么您可以看到它说 Message : Application Started ...这条消息从何而来?为什么?在哪里?! ... 甚至 Level : Informational 都是错误的...我的代码应该是 Level = Critical

在此问题发生之前,我在 BasicLogger 类中创建了一个(早已删除)方法,并具有属性 [Event(1, Message = "Application Started.", Level = EventLevel.Informational)]。 现在,每当我设置 EventSource(Name="HardymanDatabaseLog"),就会调用这个幽灵方法。

明确一下...'Application Started'文本不再存在于我的任何应用程序中(我正在使用全新的项目)...此错误的唯一原因是重复使用“HardymanDatabaseLog”EventSource名称。


这是我目前为止所做的尝试,以清除导致问题出现的任何损坏信息:

  • 重新启动计算机(标准操作!)
  • 删除并重新添加所有对Enterprise Library的引用(问题在不同的解决方案之间持续存在,因此它不能是应用程序/解决方案级别的设置)
  • 停止并删除perfmon>数据收集器集合>事件跟踪会话>Microsoft-SemanticLogging-Etw-ConsoleEventSink
  • 查看HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog,以查看我的应用程序是否已注册(肯定无法在注册表中找到“HardymanDatabaseLog”)
  • 睡一觉
  • System.Diagnostics.EventLog.DeleteEventSource("HardymanDatabaseLog")
  • 清理/重建/清理/构建/清理/等等解决方案
  • 在没有Visual Studio主机应用程序的情况下运行我的应用程序

以下是我尝试过但没有成功的方法...

  • 确定Enterprise Library是否持久化配置数据
  • 确定.NET EventSource是否持久化配置数据
  • 重新安装Enterprise Library(只有install-packages.ps1download一起提供)
  • 在键盘上猛敲头

非常感谢您的任何帮助和建议。


更新

使用 JustDecompile,我发现了 EventSource 代码中使用了一个名为 ManifestBuilder 的对象的方法。该方法似乎构建了一个 <instrumentationManifest /> 文档,其中肯定包含了幽灵方法中隐藏的所有信息。

也许有人可以解释一下这些神奇文档在 .NET 和 Enterprise Library 上下文中存储在哪里?


更新2

正如@Randy Levy通过调查SLAB源代码所发现的,该问题可以通过删除 C:\Users\<UserName>\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF 文件来解决。他的答案也与此问题相关... SLAB,out-of-process: changing the signature of an event source method causes incorrect event logging

感谢@Randy Levy!


问题描述得很好。不幸的是,即使按照正确的步骤,我也无法重现您所看到的行为(Win 8.1)。这肯定听起来像某种清单缓存问题。对于控制台应用程序SLAB ETW服务,在C:\ Users \<username> \ AppData \ Local \ Temp \ 7D2611AE-6432-4639-8B91-3E46EB56CADF处缓存清单。在我的目录中,我看到:BasicLogger.manifest.xml、HardymanDatabaseLog.manifest.xml和Microsoft-SemanticLogging.manifest.xml。我建议尝试删除该目录中的清单文件,然后再试一次。 - Randy Levy
1
您真是个绝对的传奇!删除文件非常有效。如果您想将您的评论转化为答案,我会接受它。我可以问一下您是如何追踪这些文件的位置的吗?:0) - 3-14159265358979323846264
这并没有被很好地记录下来,但是我之前遇到过类似的缓存问题,所以我重新查看了源代码中的目录。 - Randy Levy
2个回答

6
这似乎是一些清单缓存和/或损坏问题。对于控制台应用程序SLAB ETW服务,它将清单缓存在C:\Users\\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF中。如果存在清单缓存问题,则删除该目录中的清单.xml文件(在此情况下是BasicLogger.manifest.xml和HardymanDatabaseLog.manifest.xml)应该可以解决问题。步骤是停止服务、删除.xml文件,然后重新启动服务。

1
请确保您检查的是服务运行的用户配置文件。 因此,如果您的企业库语义日志记录服务运行在LocalService或NetworkService上,则路径将不是c:\ users ...。
在这种情况下,路径将为
C:\ Windows \ ServiceProfiles \ LocalService \ AppData \ Local \ Temp \ 7D2611AE-6432-4639-8B91-3E46EB56CADF

C:\ Windows \ ServiceProfiles \ NetworkService \ AppData \ Local \ Temp \ 7D2611AE-6432-4639-8B91-3E46EB56CADF。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接