2009-03-08 5 views
2

利点の議論やEntLibロギングブロックの議論に入ることなく、実行時に構成を変更できる方法はありますか?実行時にEnterprise Library Loggingブロックの設定を変更することはできますか?

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

説明:私は長年走っているサーバーアプリケーションを作成しています。アプリケーションを再起動せずに、診断/トラブルシューティングの目的で、さまざまなロググループの冗長性/出力を一時的に増やすことができます。再起動はオプションではありません。これは、プロダクションで「サイトダウン」を意味するためです。

答えて

1

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

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

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

+0

更新疑問 - 私は24/7のサーバアプリを書いて、それが再起動すると同じように、設定の書き換えでは発生しません –

+0

を再起動せずにトラブルシューティングの目的のために、様々な分野でのログを「アップバンプ」したいと思います。ステート・サーバーにSQLを使用している場合は大したことではありませんが、要求の途中で人を悩ますことがあります。私は、あなたがそこに付けることができるように、コードベースを見るか、ログウィンドウサービスを構築することを検討します。 –

5

それは達成することは実際には非常に簡単です、ちょうど次の手順を実行します。別のファイルに

置きエンタープライズライブラリの設定を

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

の変更可能性が - に加えられた変更を除きますロギングアプリケーションブロック。 MSDNのこの記事を参照してください。Updating Configuration Settings at Run-time

フィルター値を切り替える簡単なヘルパーメソッドを実装しました。より詳細なメッセージが必要な場合は、最大優先度値を増やしてこれらのエントリを登録できます。私は唯一の例外または他の非常に重要なメッセージをログに記録するとき同様に、私は1

に0に優先度の範囲を設定する
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ファイルとしてあなたのサービスをリロードすることなく、エンタープライズライブラリロギング機能を変更します決して触れられません。欠点は、ログエントリの優先順位付け/分類のような種類の慣習を使用する必要があることだけです。

+1

あなたはこれをかなり簡単に呼んでいますか?別の問題は、Webアプリケーションでは、filePathでフルパスを記述する必要があり、相対パスが機能しないということです。 entLibがMicrosoftの製品であるとは思えません。 –

関連する問題