【问题标题】:EventSource/Enterprise Library Logging caches deleted methods, (possibly in a instrumentationManifest!)EventSource/Enterprise Library Logging 缓存已删除的方法,(可能在 InstrumentationManifest 中!)
【发布时间】:2015-07-25 11:38:13
【问题描述】:

短版

如果我改变这个...

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

到这个...

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

...我仍然收到日志消息,但它们已损坏。

消息要么没有到达,要么被我当前项目中甚至不存在的缺失/删除​​/删除方法格式化!


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

我认为这可能是由于某处出现的损坏的仪器清单。

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


加长版(附图片)

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

使用来自here 的示例代码,我添加了一个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)

...这是正确的!

但是,如果我现在将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>

...然后我在日志查看器控制台中收到以下响应...

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

如果您仔细查看以 EventId : 1 开头的行,您会看到它是 Message : Application Started ... 该消息是如何、为什么以及从哪里来的?! ...甚至Level : Informational 位错误...我的代码有 Level = Critical!

在这个问题开始之前,我在BasicLogger 类中创建了一个(早已删除)方法,该方法具有[Event(1, Message = "Application Started.", Level = EventLevel.Informational)] 属性,现在,每当我设置EventSource(Name="HardymanDatabaseLog") 时,都会调用这个幻像方法。

要明确... 文本“应用程序已启动”不再存在于我的应用程序中(我正在使用一个全新的项目)...此错误的唯一原因是重用了“ HardymanDatabaseLog' 事件源名称。


这是我迄今为止所做的,试图清除任何导致事情出错的损坏信息:

  • 重新启动我的电脑(标准!)
  • 删除并重新添加对企业库的所有引用(问题在不同解决方案之间仍然存在,因此它不能是应用程序/解决方案级别设置)
  • 停止并删除 perfmon > 数据收集器集 > 事件跟踪会话 > Microsoft-SemanticLogging-Etw-ConsoleEventSink
  • 查看 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog 以查看我的应用是否已注册(当然,在注册表中的任何地方都找不到“HardymanDatabaseLog”)
  • 睡在上面
  • System.Diagnostics.EventLog.DeleteEventSource("HardymanDatabaseLog")
  • 清理/重建/清理/构建/清理/etc/etc 解决方案
  • 在没有 Visual Studio 宿主应用程序的情况下运行我的应用程序

这就是我尝试过但没有成功...

  • 确定企业库是否保留配置数据
  • 确定 .NET EventSource 是否保留配置数据
  • 重新安装企业库(download 仅包含 install-packages.ps1
  • 在键盘上敲我的头

非常感谢任何和所有帮助/建议。


更新

使用 JustDecompile,我在 EventSource 代码中找到了一个方法,该方法使用了一个名为 ManifestBuilder 的对象。该方法似乎构建了一个&lt;instrumentationManifest /&gt; 文档,该文档当然可以包含所有似乎潜伏在幻象方法中的信息。

也许有人可以阐明这些神奇文档在 .NET 和 Enterprise Library 的上下文中的存储位置?


更新 2

@Randy Levy 通过调查 SLAB 源发现,可以通过删除 C:\Users\&lt;UserName&gt;\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\&lt;username&gt;\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF。在我的目录中,我看到:BasicLogger.manifest.xml、HardymanDatabaseLog.manifest.xml、Microsoft-SemanticLogging.manifest.xml。我会尝试删除该目录中的清单文件并重试。
  • 您先生,绝对是个传奇!删除文件是一种享受。如果您想将您的评论变成答案,我会接受。请问您是如何设法追踪这些文件的位置的? :0)
  • 它没有很好的记录,但我之前看到过类似的缓存问题,所以我(重新)查找了源代码中的目录。

标签: c# .net enterprise-library etw-eventsource semantic-logging


【解决方案1】:

这听起来确实像是某种清单缓存和/或损坏问题。

对于控制台应用,SLAB ETW 服务将清单缓存在 C:\Users\\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46​​EB56CADF。如果存在清单缓存问题,则删除该目录中的清单 .xml 文件(在本例中为 BasicLogger.manifest.xml 和 HardymanDatabaseLog.manifest.xml)应该(希望)解决问题。

步骤是停止服务,删除 .xml 文件,然后重新启动服务。

【讨论】:

    【解决方案2】:

    确保您正在检查运行服务的用户配置文件。 因此,如果您的 Enterprise Library Semantic Logging Service 在 LocalService 或 NetworkService 上运行,则路径不会是 c:\users...

    这种情况下的路径是

    C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46​​EB56CADF

    C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46​​EB56CADF

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2010-11-22
      • 1970-01-01
      • 2012-02-18
      • 2012-01-26
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多