2013-06-14 12 views
16

私はロギングにlog4netを使用しています。 ファイルとイベントログに同時に書きたいと思います。log4netを使用して異なるロガーに書き込む

何らかの理由で、私は自分のログファイルでメッセージを2回見つけました。

これは私のapp.configを-セクションです:

次TOF私は私のコードで
<log4net> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="LogFileAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <param name="File" value="c:\temp\DIS-logfile.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%date %-5level %logger - %message%newline" /> 
     </layout> 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <param name="Indigo.DataIntakeService" value="eventlog" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date %-5level %logger - %message%newline" /> 
      </layout> 
    </appender> 
</log4net> 

private static readonly ILog Log = log4net.LogManager.GetLogger("DataIntakeService"); 
     private static readonly ILog LogEvents = log4net.LogManager.GetLogger("EventLogAppender"); 

     static void Main(string[] args) 
     { 
      log4net.Config.XmlConfigurator.Configure(); 
     } 

     public static void LogInfo(string message) 
     { 
      Log.Info(message); 
      LogEvents.Info(message); 
     } 

要求されるようにそれは、私のログ・ファイルに書き込みますが、メッセージがすべき私のイベントビューアにも行きますが、それは起こりません。これらのメッセージもログファイルに書き込まれます。

どこが間違っていましたか?

答えて

24

ルートロガーがファイルとイベントの両方のログアペンダーにログを記録するようにLog4Netを構成しました。 すべてのロガーはこの設定を継承しているため、ロガー "DataIntakeService"と "EventLogAppender"の両方がこれらのアペンダーにログを記録します。

イベントビューアにログメッセージが表示されない場合は、アプリケーションにイベントソースを作成する権限がない可能性があります。

UPDATE

は、どのように私はそれファイルとeventviewerに他のものにそうDataIntakeServiceログを設定することができますか?

ここではサンプルの構成です:(明示的に設定されていない限り、したがって、すべての子ロガー)

  • ルートロガーLogFileAppenderにログに記録します。このサンプルでは

    <log4net> 
        <root> 
        <level value="INFO" /> 
        <appender-ref ref="LogFileAppender" /> 
        </root> 
        <logger name="EventLogAppender" additivity="False"> 
        <level value="INFO" /> 
        <appender-ref ref="EventLogAppender" /> 
        </logger> 
        <appender> 
        ... 
    

    DataIntakeServiceロガーは明示的に構成されていないため、この構成を継承します。

  • EventLogAppenderロガーは、明示的にEventLogAppenderに記録するように構成されており、親ロガー(additivity="false")から設定を継承しないように構成されています。したがって、LogFileAppenderには記録されません。 additivity="true"を設定すると、設定が継承され、LogFileAppenderEventLogAppenderの両方にログが記録されます。

ところで、ロガーEventLogAppenderに名前を付けることは、おそらく少し混乱です:EventLogLoggerはより良い名前かもしれません。

+1

どのように私は、ファイルやeventviewerに他のものにそれそうDataIntakeServiceログを設定することができますか? –

+1

これは良い説明のおかげです。明確にするために、 'additivity'が指定されていなければ、デフォルトは' True'です。正しい? – Ben

+1

@Ben、はい、addivityのデフォルト値はtrueです。https://logging.apache.org/log4net/release/sdk/log4net.Repository.Hierarchy.Logger.Additivity.html – Joe

7

log4netを使用して、以下の設定で異なるロガーに書き込むことができます。

<log4net> 
<logger name="LogFileLogger"> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
</logger> 
<logger name="EventLogger"> 
    <level value="INFO" /> 
    <appender-ref ref="EventLogAppender" /> 
</logger> 
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
</appender> 
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
</appender> 

そしてあなたにロガーを呼び出すことができます。

private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger"); 
private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger"); 
関連する問題