ロギングには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);
}
要求に応じてログファイルに書き込みますが、メッセージもイベントビューアに送られるべきで、それは起こりません。それらのメッセージもログファイルに書き込まれます。
どこで私は間違えましたか?
ルートロガーがファイルアペンダーとイベントログアペンダーの両方にログを記録するように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"
を設定すると、設定が継承され、LogFileAppender
とEventLogAppender
の両方に記録されます。
ちなみに、ロガーにEventLogAppender
という名前を付けるのは少し混乱するかもしれません。EventLogLogger
の方がいいかもしれません。
以下の設定により、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");