2011-03-20 4 views
4

Common Infrastructure Libraries for .NET(Common.Logging)をEnterprise Library 4.1のLogging Application Blockで使用しようとしています。 docsによれば、これがサポートされています。Microsoft Enterprise Libraryロギングアプリケーションブロックを構成してロギングカテゴリを処理する方法は?

私が遭遇してる問題は、私はそうのような、何かをログに記録しようとすると、(この例では、私はASP.NET MVCアプリケーションにいる)ということである。

public ActionResult Index() 
{ 
    ViewBag.Message = "Welcome to ASP.NET MVC!"; 

    ILog log = LogManager.GetCurrentClassLogger(); 
    log.Info("Hello world!"); 

    return View(); 
} 

代わりのログメッセージを取得イベントログにエラーが表示されます。

メッセージ: 'TestApp.Controllers.HomeController'カテゴリの明示的なマッピングはありません。

まあ、デフォルトのカテゴリを設定するCommon.Loggingのいずれかのオプションがあるようには思えない、と私はそれがない場合でも、任意のカテゴリを受け入れるようにLoggingConfigurationを設定する方法を見つけ出すことはできません定義された。

は、ここに私のLoggingConfigurationの抜粋です:

<loggingConfiguration name="Logging Application Block" tracingEnabled="true" 
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true"> 
... 
    <categorySources> 
    <add switchValue="All" name="General"> 
     <listeners> 
     <add name="Formatted EventLog TraceListener" /> 
     <add name="Email TraceListener" /> 
     </listeners> 
    </add> 
    </categorySources> 
    <specialSources> 
    <allEvents switchValue="All" name="All Events" /> 
    <notProcessed switchValue="All" name="Unprocessed Category" /> 
    <errors switchValue="All" name="Logging Errors &amp; Warnings"> 
     <listeners> 
     <add name="Formatted EventLog TraceListener" /> 
     </listeners> 
    </errors> 
    </specialSources> 
</loggingConfiguration> 

私はfalseにlogWarningsWhenNoCategoriesMatchを設定しようとしたが、それは単なる警告を沈黙 - それは伐採作業は行いません。

私はまた<notProcessed switchValue="All" .../>特別なソースを取り除こうとしましたが、それは効果がないようです。

これを動作させる方法があれば誰でも知っていますか?ありがとう!

答えて

3

あなたはLogManager.GetCurrentClassLogger() Common.Loggingがカテゴリとして、あなたの呼び出し元のクラスの種類を使用しようとしているコール:

public static ILog GetCurrentClassLogger() 
{ 
    StackFrame frame = new StackFrame(1, false); 
    return Adapter.GetLogger(frame.GetMethod().DeclaringType); 
} 

あなたは勧告が過度にこの方法を使用することはありませんが(このアプローチを使用する場合StackFrameを検査するので)、はい、あなたがログインするすべてのクラスのカテゴリを作成する必要があります。これにより、Log4Netで使用される一種の階層的ロガーが再作成されます。しかし、このアプローチは維持できないので理想的ではありません。

GetCurrentClassLoggerではなく、LogManager.GetLogger(string name)のオーバーロードを使用してこの問題を回避できるはずです。これは、渡された名前がEnterprise Libraryにログインするためのカテゴリとして使用されるように見えます。したがって、カテゴリ名を定数として定義し、GetLoggerメソッドに渡して、アプリケーション全体で1つのエンタープライズライブラリカテゴリを使用させることができます。

+0

@Tuxo - Awesome!私はGetLoggerがこのように動作することに気づいていませんでした。私の__assumption__は、GetLoggerがServiceLocatorパターンのように、指定された型に一致するロガーを返すということでした。今、私の命名はもっと理にかなっています。ありがとうございました!!! – Pandincus

+0

@Pandincus - おそらくあなたが考えていたタイプのGetLoggerオーバーロードがあります。 –

4

'notProcessed'という特殊なソースは、カテゴリのソースに一致しないエントリと一致します。ここに詳しい情報があります:https://entlib.codeplex.com/discussions/215189

<notProcessed switchValue="All" name="Unprocessed Category"/> 
    <listeners> 
     <add name="Rolling Flat File Trace Listener Unprocessed"/> 
    </listeners> 
</notProcessed> 
+1

私はソースコードを変更する必要がないので、これは私のために働く解決策です。ありがとう! – Calvin

関連する問題