23
  • EnterpriseLibraryを使用してメッセージをログに記録しています。
  • これらの一部(通常はエラーと警告)をWindowsイベントシステムに渡してほしい)。今日、これらをentlib.config経由でルーティングします。

このソリューションは機能し、これまでのところ、非常に優れています。しかし、私にはこのソリューションが提供するものよりも多くのニーズがあります。異なるログに記録する必要のある複数のインストールがありますが、それらの名前をイベントビューアで論理的かつ直感的にする必要があります。ただし、Windowsイベントシステムは、名前の最初の8文字が同じである2つのカテゴリを持つことはできません。カテゴリ名は長くすることができますが、それらを区別するために最初の8文字のみが使用されます。これが発生した場合、.Netは実際に警告を出力します。

カスタムログ名の最初の8文字のみが重要であり、指定された名前の最初の8文字を使用する別のログがシステムにすでに存在します。

現在、私は不可解なプレフィックスに頼らなければなりませんが、ログ名へのアップグレードで複数のインストールが互いに「衝突」する危険性があるため、より良い解決策が必要です。

ただし、コンピュータのイベントビューアでは、ログ名の階層も存在することがわかります。これはまさに私が必要としているものです。MicrosoftとCiscoの両方が、明らかにこれを行う方法を見つけました。

MicrosoftとCiscoには階層があります

しかし、各アプリケーションを何度もインストールできるようなロギング用の階層を作成するにはどうすればよいでしょうか。このような:

CompanyName
  ApplicationName
    Installation1
    Installation2
4

2 に答える 2

23

.NET4回答

表示されているのは、Event Tracing for Windows(ETW)のチャネルです。のレジストリで関連項目を確認できますHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT

これらの機能を使用するには、Vista以降のイベントロギングAPIに取って代わり、主にC /C++開発を対象としているように見える新しいWindowsイベントログ機能を使用する必要があります。これの一部は、System.Diagnostics.Eventing名前空間を介して公開されているようです。

ETWの概要は、ETWを使用したデバッグとパフォーマンスチューニングの改善であることがわかりました。

良いニュースは、あなたがやりたいことができるように見えるということです。ログに記録されるイベントだけでなく、プロバイダー情報を含むXMLマニフェストを作成する必要があります。次に、マニフェストでメッセージコンパイラ(MC.EXE!)を使用して、ヘッダー、リソースファイル、およびログクラスを作成し、プロバイダーを登録する必要があります。

Microsoft Windows SDK forWindows7および.NETFramework4をダウンロードすると、Samples\winbase\Eventing\Provider\Simple\CSharpサブディレクトリに.NETサンプルソリューションがあり、すべての手順を実行できます。

それはあなたの階層的要件を満たし、一種のクールですが、典​​型的な基幹業務アプリケーションの場合、これは複雑さの点で少しやり過ぎかもしれません。また、メッセージコンパイラによって生成されたコードは安全でないコードであるため、ネガティブになる可能性もあります。

.NET4.5回答

.NET 4.5では、EventSourceクラスを使用したETWのサポートが大幅に向上しています。はじめに、Windows高速ログ:System.Diagnostics.Tracing.EventSourceを使用したC#/。NETのETWを参照してください 。EventSourceによるイベントログのサポートもあります。ウォークスルーについては、「EventSource NuGetパッケージの発表–Windowsイベントログへの書き込み」を参照してください。基本的に、コンパイル時にマニフェストとマニフェストDLLが各EventSourceに対して生成され、これらはwevtutil.exeを使用して登録できます。EventSourceとイベントログチャネルのサポートが追加されたことで、このアプローチは簡単で実行可能になりました。

最後に、ETWに関心のある方は、パターン&プラクティスチームがETWを使用できるアプリケーションブロックSemantic LoggingApplicationBlockを持っていることに注意してください。

于 2012-05-10T06:59:13.840 に答える
4

プロバイダーには、「Company-Product-Component」という形式の名前を付ける必要があります。明確にするために、プロバイダーの名前には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>
    ...

これが私のログがイベントビューアにどのように表示されるかです

イベントビューアに表示されるフォルダ階層は幻想です。これは、実際には、厳密な3フォルダーの深層構造としてレンダリングされたプロバイダーとチャネルの単なるフラットリストです。これが、下のいくつかのフォルダがMicrosoft/Windowsさらにネストするのではなく、名前にダッシュが含まれている理由です。

于 2013-03-21T23:48:05.213 に答える