3-1*_*264 7 .net c# enterprise-library etw-eventsource semantic-logging
如果我改变了......
EventSource(Name="BasicLogger")
public class BasicLogger : EventSource { ... }
Run Code Online (Sandbox Code Playgroud)
对...
EventSource(Name="HardymanDatabaseLog")
public class BasicLogger : EventSource { ... }
Run Code Online (Sandbox Code Playgroud)
...我仍然收到日志消息,但它们已损坏.
消息没有到达,或者它们是由当前项目中甚至不存在的缺失/删除/删除方法格式化的!
由于某些未知原因,特定字符串'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); }
}
}
Run Code Online (Sandbox Code Playgroud)
...我在日志查看器控制台(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>
Run Code Online (Sandbox Code Playgroud)
...然后我在日志查看器控制台中得到以下响应...
...这不仅丢失了第一条消息,而且损坏了第二条消息!
如果你仔细观察开始的那条线,EventId : 1那么你可以看到它说Message : Application Started... 那个消息来自何方,为什么以及在哪里?!......甚至Level : Informational有点错......我的代码有Level = Critical!
在这个问题开始之前,我在BasicLogger具有该属性的类中创建了一个(早已删除的)方法[Event(1, Message = "Application Started.", Level = EventLevel.Informational)],现在,每当我设置时,都会EventSource(Name="HardymanDatabaseLog")调用这个幻像方法.
要清楚...... 我的应用程序中的任何地方都不再存在"应用程序已启动"文本(我正在使用一个全新的项目)...此错误的唯一原因是重用了'HardymanDatabaseLog'EventSource名称.
这是我到目前为止所做的事情,试图清除任何损坏的信息使事情出错:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog我的应用程序是否已注册(当然在注册表中找不到'HardymanDatabaseLog`)这就是我尝试但却没有成功的......
install-packages.ps1包含在下载中)任何和所有帮助/建议感激不尽.
更新
使用JustDecompile,我在EventSource代码中找到了一个使用名为a的对象的方法ManifestBuilder.该方法似乎构建了一个<instrumentationManifest />文档,该文档当然可以包含幻像方法中潜伏的所有信息.
也许有人可以了解这些魔术文档在.NET和企业库的上下文中存储的位置?
更新2
正如@Randy Levy通过调查SLAB源发现的那样,可以通过删除文件来解决问题 C:\Users\<UserName>\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF.他的回答也与这个问题有关... SLAB,进程外:更改事件源方法的签名会导致错误的事件记录.
谢谢@Randy Levy!
这当然听起来像某种明显的缓存和/或腐败问题.
对于控制台应用程序,SLAB ETW Service将清单缓存在C:\ Users \\ AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF中.如果存在清单缓存问题,则删除该目录中的清单.xml文件(在本例中为BasicLogger.manifest.xml和HardymanDatabaseLog.manifest.xml)应该(希望)解决该问题.
步骤是停止服务,删除.xml文件,然后重新启动服务.