简短版
如果我改变这个...
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
)中获得以下响应:
......这是正确的!
但是,如果我现在更新 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")
,就会调用这个幽灵方法。
明确一下...'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.ps1
与download一起提供) - 在键盘上猛敲头
非常感谢您的任何帮助和建议。
更新
使用 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!
C:\ Users \<username> \ AppData \ Local \ Temp \ 7D2611AE-6432-4639-8B91-3E46EB56CADF
处缓存清单。在我的目录中,我看到:BasicLogger.manifest.xml、HardymanDatabaseLog.manifest.xml和Microsoft-SemanticLogging.manifest.xml。我建议尝试删除该目录中的清单文件,然后再试一次。 - Randy Levy