Укороченная версия
Если я изменю это...
EventSource(Name="BasicLogger")
public class BasicLogger : EventSource { ... }
к этому ...
EventSource(Name="HardymanDatabaseLog")
public class BasicLogger : EventSource { ... }
... Я все еще получаю сообщения журнала, но они повреждены.
Либо сообщения не приходят, либо они отформатированы отсутствующим/удаленным/удаленным методом, которого даже не существует в моем текущем проекте!
По какой-то неизвестной причине возникла проблема с конкретной строкой HardymanDatabaseLog.
Я думаю, что это может быть связано с поврежденным манифестом инструментов, который где-то проявляется.
Читай дальше, чтобы узнать больше ...! (спасибо :о))
Длинная версия (с картинками)
У меня есть простое консольное приложение, которое ссылается на 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")
- Решение Clean/Rebuild/Clean/Build/Clean/etc/etc
- Запуск моего приложения без хост-приложения Visual Studio
И это то, что я пытался, но не имел успеха с...
- Определите, сохраняет ли Enterprise Library данные конфигурации
- Определите, сохраняет ли .NET EventSource данные конфигурации.
- Переустановите Enterprise Library (только
install-packages.ps1
включены в загрузку) - Бьюсь головой о клавиатуру
Любая помощь/предложения с благодарностью.
Обновить
Используя JustDecompile, я нашел метод в коде EventSource
, который использует объект с именем ManifestBuilder
. Похоже, что этот метод создает <instrumentationManifest />
документ, который, безусловно, может содержать всю информацию, скрывающуюся в фантомном методе.
Возможно, кто-нибудь сможет пролить свет на то, где хранятся эти волшебные документы в контексте .NET и Enterprise Library?
Обновление 2
Как обнаружил @Randy Levy, исследуя источник SLAB, проблему можно решить, удалив файлы в C:\Users\<UserName>\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF
. Его ответ также относится к этому вопросу... -causes-in">SLAB, вне процесса: изменение сигнатуры метода источника события приводит к неправильной регистрации событий.
Спасибо, @Рэнди Леви!
C:\Users\<username>\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF
. В моем каталоге я вижу: BasicLogger.manifest.xml, HardymanDatabaseLog.manifest.xml, Microsoft-SemanticLogging.manifest.xml. Я бы попробовал удалить файлы манифеста в этом каталоге и повторить попытку. - person Randy supports Monica   schedule 26.07.2015