0

、、およびを使用Log4Netしています。私がこれを使用しているプロジェクトには、 と通信する も含まれます。Castle.WindsorLoggingFacilityLog4netIntegrationNHibernatelog4net

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

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

だから私が今持っているのは、Windsor と 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 を目指すように Windsor に指示するにはどうすればよいですか?

これを行う 1 つの方法は、ロギングを使用したいタイプごとに特定のロガーを作成することですが、後でそれを忘れたときに自分自身を撃つための優れた方法のように思えます。

4

2 に答える 2

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>
于 2012-04-17T21:30:05.577 に答える
0

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

github から Windsor をプルしてビルドする場合、LoggingFacility には、使用ToLog(string LogName)するログを制御できる構成メソッドが用意されています。

于 2012-04-18T17:10:14.353 に答える