19

ロギングを行うために 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);
}

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

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

4

2 に答える 2

33

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

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

アップデート

DataIntakeService がファイルにログを記録し、もう一方が eventviewer にログを記録するように構成するにはどうすればよいですか?

構成例を次に示します。

<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"すると、設定が継承され、 と の両方にログが記録されLogFileAppenderますEventLogAppender

ちなみに、ロガーの名前付けはEventLogAppender少し紛らわしいかもしれません:EventLogLoggerより良い名前かもしれません。

于 2013-06-14T10:44:45.927 に答える
12

以下の設定により、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");
于 2017-03-28T16:21:16.510 に答える