7

短縮版

これを変えると・・・

EventSource(Name="BasicLogger")
public class BasicLogger : EventSource { ... }

これに...

EventSource(Name="HardymanDatabaseLog")
public class BasicLogger : EventSource { ... }

... まだログ メッセージを受け取りますが、メッセージが壊れています。

メッセージが届かないか、現在のプロジェクトにも存在しない欠落/削除/削除されたメソッドによってフォーマットされています!


不明な理由により、特定の文字列「HardymanDatabaseLog」に問題があります

どこかにマニフェストしている破損したインストルメンテーション マニフェストが原因である可能性があると思います。

詳細を確認するために読んでください...!( ありがとう :o) )


ロングバージョン(写真あり)

EnterpriseLibrary.SemanticLoggingnuget パッケージを介して参照する単純なコンソール アプリケーションがあります。

hereのサンプル コードを使用して、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.xmlHardymanDatabaseLog

<?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>

...その後、ログ ビューアー コンソールに次の応答が表示されます ...

悪いログ

...最初のメッセージが失われただけでなく、2 番目のメッセージが破損しました!

開始する行をよく見ると、次のように表示されているEventId : 1ことがわかりますMessage : Application Started...どのように、なぜ、そしてどこからそのメッセージが来ているのですか?! ...Level : Informational少しでも間違っています...私のコードにはLevel = Critical!

BasicLoggerこの問題が発生する前に、属性 を持つクラスに (長い間削除されていた) メソッドを作成しましたが[Event(1, Message = "Application Started.", Level = EventLevel.Informational)]、現在、 を設定するたびにEventSource(Name="HardymanDatabaseLog")、このファントム メソッドが呼び出されています。

明確にするために... 「Application Started」というテキストがアプリケーションのどこにも存在しません(完全に新しいプロジェクトを使用しています)...このエラーの唯一の原因は、「HardymanDatabaseLog」EventSource名の再利用です。


これまでのところ、破損した情報が問題を引き起こしているものをすべてクリアするために行ったことは次のとおりです。

  • コンピューターを再起動しました (標準!)
  • Enterprise Library へのすべての参照を削除して再度追加します (問題はさまざまなソリューション間で持続するため、アプリケーション/ソリューション レベルの設定ではありません)。
  • perfmon を停止して削除する > データ コレクター セット > イベント トレース セッション > Microsoft-SemanticLogging-Etw-ConsoleEventSink
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLogアプリが登録されているかどうかを調べます (確かに、レジストリのどこにも 'HardymanDatabaseLog` が見つかりませんでした)
  • その上で寝る
  • System.Diagnostics.EventLog.DeleteEventSource("HardymanDatabaseLog")
  • クリーン/リビルド/クリーン/ビルド/クリーン/etc/etc ソリューション
  • Visual Studio ホスト アプリケーションなしでアプリケーションを実行する

そして、これは私が試したものですが、成功しませんでした...

  • Enterprise Library が構成データを永続化するかどうかを決定する
  • .NET EventSource が構成データを永続化するかどうかを判断する
  • Enterprise Library を再インストールします (ダウンロード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、プロセス外: イベント ソース メソッドのシグネチャを変更すると、イベント ログが正しくありません

ありがとう@ランディ・レヴィ!

4

2 に答える 2