EventSource/Enterprise Library Logging кэширует удаленные методы (возможно, в инструментальном манифесте!)

Укороченная версия

Если я изменю это...

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, вне процесса: изменение сигнатуры метода источника события приводит к неправильной регистрации событий.

Спасибо, @Рэнди Леви!


person 3-14159265358979323846264    schedule 25.07.2015    source источник
comment
Хорошее описание проблемы. К сожалению, даже с хорошими шагами я не могу воспроизвести поведение, которое вы видите (Win 8.1). Это определенно звучит как какая-то проблема с кэшированием манифеста. Для консольного приложения SLAB ETW Service кэширует манифесты по адресу 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
comment
Вы, сэр, настоящая легенда! Удаление файлов помогло. Если вы хотите превратить свой комментарий в ответ, я приму его. Могу я спросить, как вам удалось отследить местонахождение этих файлов? :0)   -  person 3-14159265358979323846264    schedule 27.07.2015
comment
Это не очень хорошо документировано, но я видел подобные проблемы с кешем раньше, поэтому я (повторно) просмотрел каталог в исходном коде.   -  person Randy supports Monica    schedule 28.07.2015


Ответы (2)


Это, безусловно, звучит как проблема с кэшированием манифестов и/или повреждением.

Для консольного приложения служба SLAB ETW кэширует манифесты в папке C:\Users\\AppData\Local\Temp\7D2611AE-6432-4639-8B91-3E46EB56CADF. Если есть проблема с кэшированием манифеста, то удаление XML-файлов манифеста (в данном случае BasicLogger.manifest.xml и HardymanDatabaseLog.manifest.xml) в этом каталоге должно (надеюсь) решить проблему.

Шаги заключаются в том, чтобы остановить службу, удалить файлы .xml и перезапустить службу.

person Randy supports Monica    schedule 28.07.2015

Убедитесь, что вы проверяете профиль пользователя, под которым работает ваша служба. Поэтому, если ваша служба семантического ведения журналов Enterpise Library работает на LocalService или NetworkService, путь не будет c:\users...

Путь в этом случае будет

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

or

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

person ambidexterous    schedule 08.02.2017