Подтвердить что ты не робот

Как создать иерархию имен в системе событий Windows?

  • Я регистрирую сообщения с помощью Enterprise Library.
  • Я хочу, чтобы некоторые из них (как правило, ошибки и предупреждения) передавались в систему событий Windows). Я сегодня направляю их через entlib.config.

Это решение работает и до сих пор, так хорошо. Но у меня больше потребностей, чем это решение дает мне. У меня есть несколько установок, которые должны регистрироваться в разных журналах, но я хочу, чтобы их имена были логичными и интуитивно понятными в средстве просмотра событий. Но в системе событий Windows не может быть двух категорий, где первые 8 символов в названии одинаковы. Название категории может быть длиннее, но только первые 8 букв используются для их различения..Net действительно выводит предупреждение, если это происходит:

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

В настоящее время мне приходится прибегать к криптографическим префиксам, но мне все еще грозит несколько попыток "столкновения" друг с другом в regrads с именем журнала, поэтому мне нужно лучшее решение.

Однако, в средстве просмотра событий на моем компьютере я вижу, что есть также иерархии логических имен, которые точно, что мне нужно. Очевидно, что и Microsoft, и Cisco нашли способ сделать это:

Microsoft and Cisco have a hierarchy

Но как я могу создать такую ​​иерархию для ведения журнала, где каждое приложение может быть установлено несколько раз? Например:

CompanyName
  ApplicationName
    Installation1
    Installation2
4b9b3361

Ответ 1

Ответ .NET 4

Похоже, что вы видите каналы из Event Tracing for Windows (ETW). Вы можете увидеть соответствующие элементы в реестре в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT.

Чтобы использовать эти функции, вам придется использовать новый Windows Event Log, который заменяет Журнал событий, начинающийся с Vista, и похоже, что он ориентирован главным образом на разработку C/С++. Похоже, что некоторые из них отображаются через System.Diagnostics.Eventing Namespace.

Я нашел хороший обзор ETW Улучшить настройку отладки и производительности с помощью ETW.

Хорошей новостью является то, что похоже, что вы можете делать то, что хотите. Вам нужно будет создать манифест XML, содержащий информацию о поставщике, а также события, которые будут регистрироваться. Затем вам нужно использовать Компилятор сообщений (MC.EXE!) В манифесте для создания заголовков, файлов ресурсов и протоколирования, а затем зарегистрировать поставщика.

Если вы загрузите Microsoft Windows SDK для Windows 7 и .NET Framework 4, вы найдете в подкаталоге Samples\winbase\Eventing\Provider\Simple\CSharp образцовое решение .NET который должен провести вас через все этапы.

Несмотря на то, что он соответствует вашему иерархическому требованию и как-то круто, для типичной линейки бизнес-приложений это может быть немного излишним с точки зрения сложности. Кроме того, код, сгенерированный компилятором сообщений, является небезопасным кодом, что также может быть отрицательным.

Ответ .NET 4.5

В .NET 4.5 существует гораздо более эффективная поддержка ETW с использованием класса EventSource. См. Высокоскоростное ведение Windows: ETW в С#/.NET с использованием System.Diagnostics.Tracing.EventSource для ознакомления. Также имеется поддержка журнала событий с EventSource. См. Объявление пакета NuGet EventSource - Запись в журнал событий Windows для прохода. В принципе, во время компиляции для каждого EventSource создается манифест и манифест DLL, и они могут быть зарегистрированы с помощью wevtutil.exe. С добавлением поддержки канала EventSource и Event Log этот подход теперь выглядит прямым и жизнеспособным.

Наконец, обратите внимание на тех, кто интересуется ETW, что команда шаблонов и практик имеет блок приложений Блок приложений семантического протоколирования, который может использовать ETW.

Ответ 2

Провайдеры должны быть названы чем-то вроде формы "Компания-продукт-компонент". Чтобы быть ясным, имя поставщика должно содержать 2 символа "-". Документацию по этому вопросу можно найти здесь.

Каналы должны иметь свои имена, записанные определенным образом. Опять же, в документации MSDN объясняется это. Вы должны назвать свой канал чем-то вроде формы "Company-Product-Component/type".

Вот фрагмент манифеста, который я написал для вас, чтобы использовать в качестве примера:

<provider name="Our Company-OurApp-Service"
          guid="{4990f5dc-85a0-4660-9ce0-275e027a02d2}"
          symbol="GUID_PROVIDER"
          resourceFileName="C:\Program Files (x86)\Our Company\OurApp\service.exe"
          messageFileName="C:\Program Files (x86)\Our Company\OurApp\service.exe"
          parameterFileName="C:\Program Files (x86)\Our Company\OurApp\service.exe"
          message="$(string.Provider.Name)">
    <channels>
        <channel chid="c1"
                 name="Our Company-OurApp-Service/Operational"
                 type="Operational"
                 symbol="CHANNEL_1"
                 isolation="Application"
                 enabled="true"/>
    </channels>
    ...

Here is how my logs show up in the event viewer

Иерархия папок, которую мы видим в средстве просмотра событий, является иллюзией. Это действительно просто плоский список поставщиков и каналов, созданных в виде жесткой структуры с 3-кратной глубиной. Вот почему несколько папок под Microsoft/Windows имеют тире в своих именах, а не вложенные далее.