2

EntLibロギングブロックのメリットやその他の議論に立ち入ることなく、実行時に構成を変更できる方法はありますか?

たとえば、一般的なイベントをフラットファイルに記録し、重大なイベントをイベントログに記録するようにブロックを構成しています。
アプリケーションを再起動せずに、一般的なイベントをコンソールなどに記録するように変更する方法はありますか?

明確化:私は長時間実行されるサーバーアプリケーションを書いています。アプリケーションを再起動せずに、診断/トラブルシューティングの目的で、さまざまなロググループの詳細度/出力を一時的に増やすことができるようにしたいと思います。再起動は、本番環境での「サイトダウン」を意味するため、オプションではありません。

4

2 に答える 2

5

実際には非常に簡単に達成できます。次の手順に従うだけです。

Enterprise Library 構成を別のファイルに配置する

<configuration>
  <configSections>
    <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <enterpriseLibrary.ConfigurationSource selectedSource="EntLib Config">
    <sources>
      <add name="EntLig Config" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          filePath="EntLib.config" />
    </sources>
  </enterpriseLibrary.ConfigurationSource>
</configuration>

ログ フィルタを追加します。ログ エントリの優先度またはカテゴリを使用してログ エントリをフィルタリングできるため、コード内でそれに応じて優先度またはカテゴリを設定する必要があります。たとえば、非常に重要なメッセージに 1 などの優先度の低い番号を付けたい場合、より詳細なメッセージには 10 を指定できます。

<configuration>
  ...
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
    ...
    <logFilters>
      <add minimumPriority="1" maximumPriority="10" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        name="Priority Filter" />
    ...
  </loggingConfiguration>
</configuration>

実行時に Enterprise Library 構成に加えられた変更は無視されます。ただし、Logging Application Block に加えられた変更は除きます。MSDN のこの投稿を参照してください:実行時に構成設定を更新する

フィルター値を切り替える単純なヘルパー メソッドを実装しました。より詳細なメッセージが必要な場合は、最大優先度の値を増やして、それらのエントリを登録できるようにします。同様に、例外やその他の非常に重要なメッセージのみをログに記録する場合は、優先順位の範囲を 0 から 1 に設定します。

var path = System.IO.Path.Combine(Environment.CurrentDirectory, "EntLib.config");
var xd = XDocument.Load(path);

var x = (from z in xd.Root.Elements("loggingConfiguration").Elements("logFilters").Elements() where (z.Attribute("name").Value == "Priority Filter") select z).SingleOrDefault();
x.Attribute("minimumPriority").Value = 1; // Change this value...
x.Attribute("maximumPriority").Value = 5; // ... and this one to specify the range you want to log.

xd.Save(path);

これにより、web.config がまったく変更されないため、サービスをリロードせずに Enterprise Library Logging 機能が変更されます。唯一の欠点は、ログエントリの優先順位付け/分類のある種の規則を使用する必要があることです。

于 2009-11-23T11:09:34.310 に答える
1

ConfigurationFileMap を開いて、ロガーの構成を変更できることは知っています。ただし、構成ファイルを保存するとアプリケーションがリセットされ、デフォルトに戻す必要があるため、これで問題が解決するかどうかはわかりません。これは、コンソールを接続するだけでも大変な作業です。

ロギング ブロックはプロバイダー モデルを使用するため、実行時にアタッチできるはずですが、これを行う方法がわかりません。ただし、EntLib の完全なソースがあるので、これを理解するためにコード スタックを実行することは、大きな雑用ではありません。コードをハッキングするためにコードを振り返る必要さえありません。

あなたの目標は、アプリケーションをリアルタイムで監視することだと思いますか?

于 2009-03-09T01:52:35.823 に答える