精简版
如果我改变这个...
EventSource(Name="BasicLogger")
public class BasicLogger : EventSource { ... }
对此...
EventSource(Name="HardymanDatabaseLog")
public class BasicLogger : EventSource { ... }
...我仍然收到日志消息,但它们已损坏。
要么消息没有到达,要么它们被我当前项目中甚至不存在的缺失/删除/删除方法格式化!
由于某些未知原因,特定字符串“HardymanDatabaseLog”存在问题
我认为这可能归结为在某处出现的损坏的仪器清单。
请继续阅读以了解更多信息 ...!(谢谢:o))
加长版(附图)
我有一个EnterpriseLibrary.SemanticLogging
通过 nuget 包引用的简单控制台应用程序。
使用此处的示例代码,我添加了一个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 是否保留配置数据
- 重新安装企业库(仅
install-packages.ps1
包含在下载中) - 用头敲键盘
非常感谢任何和所有帮助/建议。
更新
使用 JustDecompile,我在EventSource
代码中发现了一个方法,该方法使用了一个名为 a 的对象ManifestBuilder
。该方法似乎构建了一个<instrumentationManifest />
文档,该文档当然可以包含似乎潜伏在幻像方法中的所有信息。
也许有人可以阐明这些神奇文档在 .NET 和 Enterprise Library 的上下文中的存储位置?
更新 2
正如@Randy Levy 通过调查 SLAB 源发现的那样,可以通过删除 C:\Users\<UserName>\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF
. 他的回答也与这个问题有关...... SLAB,进程外:更改事件源方法的签名会导致不正确的事件记录。
谢谢@Randy Levy!