問題タブ [etw-eventsource]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - EventSource - 適用するメソッド シグネチャの変更を取得できません
EventSource を使用して ETW にログインしています。.Net Framework 4.5 を使用しています。
私は開発の初期段階にあるので、EventSource のサブクラス内でメソッド シグネチャを頻繁に変更します。変更を加えるたびにバージョンをインクリメントする必要はありません。バージョンは 1 バイトしかないので、すぐにバージョンが足りなくなります。
バージョン属性を追加/変更せずに ETW に署名の変更を認識させる方法はありますか?
マニフェスト ファイルの生成と関係があるように感じますが、v4.5 でこれがどのように行われるかについての多くの情報を実際に見つけることはできません。以前はマニフェスト ファイルを手動で生成する必要があったようですが、現在は魔法のように生成されています。
これに関するヘルプは大歓迎です。
編集:
署名を変更しても、ログはまだ古い署名のように見えます。たとえば、私のメソッドが次のようになっている場合
後で、次のような別のパラメーターを追加したい場合
Version 属性をインクリメントしない限り、メッセージ値はペイロードに表示されません。Version 属性を変更せずに、変更した署名を ETW に認識させたい。
c# - EventSource/Enterprise Library Logging は、削除されたメソッドをキャッシュします (おそらく、instrumentationManifest で!)
短縮版
これを変えると・・・
これに...
... まだログ メッセージを受け取りますが、メッセージが壊れています。
メッセージが届かないか、現在のプロジェクトにも存在しない欠落/削除/削除されたメソッドによってフォーマットされています!
不明な理由により、特定の文字列「HardymanDatabaseLog」に問題があります
どこかにマニフェストしている破損したインストルメンテーション マニフェストが原因である可能性があると思います。
詳細を確認するために読んでください...!( ありがとう :o) )
ロングバージョン(写真あり)
EnterpriseLibrary.SemanticLogging
nuget パッケージを介して参照する単純なコンソール アプリケーションがあります。
hereのサンプル コードを使用して、BasicLogger
クラスを追加しました。
シンプルなアプリを実行すると...
... ログ ビューアー コンソールに次の応答が表示されます ( SemanticLogging-svc.exe
)
... どちらが正しい!
しかしEventSource
、属性をに更新し、参照も[EventSource(Name = "HardymanDatabaseLog")]
調整すると...SemanticLogging-svc.xml
HardymanDatabaseLog
...その後、ログ ビューアー コンソールに次の応答が表示されます ...
...最初のメッセージが失われただけでなく、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、プロセス外: イベント ソース メソッドのシグネチャを変更すると、イベント ログが正しくありません。
ありがとう@ランディ・レヴィ!
events - ETW EventSource が Windows Server でイベントをログに記録しない
Nuget で Microsoft EventSource Libary 1.1.25 を使用して ETW EventSource を作成しました。EventSource の目的は、管理しているセキュリティ アプリケーションのカスタム イベント ログにイベントを送信することです。コードはローカルで動作しますが、サーバー上のイベント ログにイベントを書き込むことができません。
EventSource は (同様に) Company-Security という名前で、管理チャネルにイベントを送信します。開発用マシンのローカルで、eventsource マニフェストを wevtutil に登録し、Windows イベント ビューアーの下にある管理者ログを含む Company-Security フォルダーを確認できます。アプリケーションを実行すると、イベントがイベント ログに記録されます。
ただし、アプリケーションをテスト サーバー (Windows Server 2012 を実行) に展開すると、イベント ログが機能しません。マニフェストを wevtutil に登録すると、ログが作成されてイベント ビューアーに表示されますが、名前は少し異なります。Company-Security/Admin という名前のフォルダーが作成され、そのフォルダー内に Company-Security/Admin という名前のログが作成されます。サーバーで perfview を実行して、作成されたイベントを確認することもできます。ただし、イベント ログには何も書き込まれません。また、EventSource コードにいくつかのデバッグ ステートメントを追加したところ、EventSource IsEnabled() が true を返していることがわかります。
以下は、私が書いたイベントソースの基本クラスと実装クラスのコード スニペットです。
イベントログがサーバーでは機能しないが、開発マシンでは機能する理由について調査しましたが、説明が見つかりません。私は何かが欠けていると思いますが、何がわからないのですか。
抽象基本クラス:
EventSource クラス:
c# - ユーザー定義オブジェクトを WriteEvent にシリアル化する方法は?
MSDN のドキュメントによると、Write-event は int および string パラメータ タイプのみをサポートしています。ユーザーが作成した ct を Write-event に渡したいのですが、この機能を取得するにはどうすればよいですか? この機能を実現するための適切なシリアライザーは何でしょうか?