2012-04-17 6 views
0

私はLog4NetCastle.WindsorLoggingFacility、およびLog4netIntegrationを使用しています。私がこれを使用しているプロジェクトには、NHibernateが含まれており、log4netとも話しています。LoggingFacility - 使用するロガーの制御

私がやっていることは、すべてのシステムログが別のログ(system-log.txt)で終わる間に、NHibernateが1つのログ(data-log.txt)で終了するようにログを分割することです。

私が抱えている問題は、windsorによって注入されたLoggerがlog4net構成のルート・ロガーに書き込むように見えるということです。 NHibernateはNHibernateまたはNhibernateという名前のロガーを探します。そのため、これらのログをdata-log.txtアペンダに流用できますが、ルートロガーにも書き込みます。

ウィンザーとNHibernateのログはすべてルートロガーで終わり、NHibernateからのログはさらにnhibernate固有のロガーで終了します。ここで

は私のapp.configをで私log4netのコンフィグセクションです:

<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<appender name="Console" type="log4net.Appender.ConsoleAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline"/> 
    </layout> 
</appender> 
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> 
    </layout> 
</appender> 
<appender name="NHibernateLogAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="data-log.txt" /> 
    <!-- various stuff --> 
</appender> 
<appender name="SystemLogAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="system-log.txt" /> 
    <!-- various stuff --> 
</appender> 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="AspNetTraceAppender" /> 
    <appender-ref ref="Console" />  
</root> 

<logger name="SystemLogger"> 
    <level value="ALL" /> 
    <appender-ref ref="SystemLogAppender" /> 
</logger> 
<logger name="NHibernate"> 
    <level value="WARN" /> 
    <appender-ref ref="NHibernateLogAppender" /> 
</logger>  
<logger name="NHibernate.SQL">  
    <level value="DEBUG" /> 
    <appender-ref ref="NHibernateLogAppender"/> 
</logger> 

、ウィンザーは、私が目指してウィンザーに伝えるにはどうすればよいので container.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithAppConfig());

のようなコードで構成されつつありますルートの代わりにSystemLoggerのために?

これを行う方法の1つは、ロギングを使用するそれぞれのタイプの特定のロガーを作成することですが、後でそれを忘れた場合は足元で自分を撃つのに最適な方法です。

答えて

4

すべてのアペンダーを持つルートロガーのみを使用します。そして、ロガー名にアペンダホワイトリストとブラックリストフィルタを使用します。

<appender name="NHibernateLogAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="data-log.txt" /> 
    <!-- various stuff --> 

    <filter type="log4net.Filter.LoggerMatchFilter"> 
    <loggerToMatch value="NHibernate" /> 
    </filter> 
</appender> 

<appender name="SystemLogAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="system-log.txt" /> 
    <!-- various stuff --> 

    <filter type="log4net.Filter.LoggerMatchFilter"> 
    <loggerToMatch value="NHibernate" /> 
    <acceptOnMatch value="false" /> 
    </filter> 
</appender> 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="NHibernateLogAppender" /> 
    <appender-ref ref="SystemLogAppender" /> 
</root> 
+0

ホワイト/ブラックリストのものには何らかの方法がなければならないことは分かっていましたが、わかりませんでした。ありがとう! –

0

別のルートを:私は、ユーザーが使用するログ名を指定することができますCastle.Windsorチームにパッチを提出しました。

githubからWindsorをプル&ビルドすると、LoggingFacilityにはコンフィグレーションメソッドToLog(string LogName)が用意され、使用するログを制御することができます。

+0

私の.ToLogメソッドはcastle.windsorの3.1リリースに含まれていたので、みんな楽しんでください。 –

関連する問題