0

カスタム EventSource クラスを作成し、次のようにログのメソッドを追加します。

[EventSource(Name = "MyCompany")]
public class MyCompanyEventSource : EventSource
{
[Event(6, Message = "test.", Keywords = Keywords.Perf,
            Level = EventLevel.Warning)]
        public void Test()
        {
            this.WriteEvent(6);
        }
}

また、SemanticLogging-svc.exe -c を使用してトレース イベント サービスを開始し、このコマンドを実行する前に、SemanticLogging-svc.xml を次のように構成しました。

<eventSource name="MyCompany" level="LogAlways"/>

そして、Test() メソッドの呼び出しを開始します。初めて、flatFileSink は正しいレベルのイベントを警告として記録します。ただし、属性の Test() メソッドのレベルを Critical に変更して Test() メソッドを呼び出した後でも、flatFileSink はレベルを警告として記録します。それは完全に間違っていました!OnNext メソッドのパラメーターである EventEntry のスキーマであることはわかっています。しかし、インプロセス リスナーを使用すると、レベルが Critical に更新される可能性がありますが、これは正しいことです。

では、アウトプロセスを使用している場合、レベルがまだ古いのはなぜですか? それはETWに何か問題がありますか?マシンにキャッシュがあるようです。また、このキャッシュは、パフォーマンス モニターでイベント トレース セッションを停止して削除したり、コンピューターを再起動したりしてもクリアできませんでした。このキャッシュを本当にクリアしたいのですが、その方法がわかりませんでした。

また、Event Attribute の Version を変更したり、EventSource Name を別の名前に変更したりすると、プロセス外のレベルが更新されることがわかっています。しかし、バージョンを変更するのを忘れている可能性があるため、これは良い方法ではないと思います。

それで、誰かが私を助けることができますか?

4

2 に答える 2

1

この問題は、アウトプロセス ロガーがイベント ソースのマニフェストをキャッシュしていることが原因で発生します: TraceEventManifestsCache

このキャッシュは、次のパスで生成された一時ディレクトリにマニフェスト XML を書き込みます。

Path.Combine(Path.GetTempPath(), "7D2611AE-6432-4639-8B91-3E46EB56CADF");

の値はPath.GetTempPath()、サービスを実行しているユーザーと、実行している Windows のバージョンによって異なります。この一時ディレクトリには、キャッシュされたマニフェストがあります。

サービスは、キャッシュされたマニフェストをフラッシュする条件を明確にしませんが、期待したときに常にトリガーされるとは限りません。

マニフェストのキャッシュ ファイルを削除すると、プロバイダーは新しいバージョンのマニフェストを取得する必要があります。マニフェストをすぐに取得するには、サービスを再起動する必要があります。

于 2016-01-28T21:00:42.210 に答える
0

Version理論的には、属性のプロパティを更新するEventとうまくいくはずです。shouldを強調します。

常に機能するとは限りません。あなたのスキーマは秘密の魔法の文書化されていない場所に保存されており、 がそのように感じたEventSource場合に何らかの形で更新されます。再起動しても役に立ちません。

于 2015-09-05T03:40:21.903 に答える