web-dev-qa-db-ja.com

log4netを使用して別のロガーに書き込む

ロギングにはlog4netを使用しています。ファイルとイベントログに同時に書き込みたいのですが。

何らかの理由で、ログファイルにメッセージが2回見つかりました。

これは私のapp.config-sectionです:

<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);
}

要求に応じてログファイルに書き込みますが、メッセージもイベントビューアに送られるべきで、それは起こりません。それらのメッセージもログファイルに書き込まれます。

どこで私は間違えましたか?

18
Bart Schelkens

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

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

[〜#〜]更新[〜#〜]

DataIntakeServiceがファイルにログを記録し、もう1つはイベントビューアにログを記録するように構成するにはどうすればよいですか?

次に設定例を示します。

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

このサンプルでは:

  • ルートロガー(および明示的に設定されていない限り、すべての子ロガー)はLogFileAppenderにログを記録します。 DataIntakeServiceロガーは明示的に設定されていないため、この設定を継承します。

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

ちなみに、ロガーにEventLogAppenderという名前を付けるのは少し混乱するかもしれません。EventLogLoggerの方がいいかもしれません。

30
Joe

以下の設定により、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");
11
serefbilge