C# 使用 log4net 写入不同的记录器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 
原文地址: http://stackoverflow.com/questions/17106559/
Warning: these are provided under cc-by-sa 4.0 license.  You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using log4net to write to different loggers
提问by Bart Schelkens
I am using log4net to do my logging. I would like it to write to a file and to the eventlog at the same time.
我正在使用 log4net 进行日志记录。我希望它同时写入文件和事件日志。
For some reason, I find the messages twice in my logfile.
出于某种原因,我在日志文件中找到了两次消息。
This is my app.config-section :
这是我的 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>
In my code I have tof following :
在我的代码中,我有以下几点:
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);
}
It writes to my log-file, as requested, but the messages should also go to my eventviewer and that doesn't happen. It writes those messages to the logfile as well.
它根据要求写入我的日志文件,但消息也应该发送到我的事件查看器,而这不会发生。它也将这些消息写入日志文件。
Where did I go wrong?
我哪里做错了?
采纳答案by Joe
You have configured Log4Net so that the root logger logs to both file and event log appenders. All loggers inherit this configuration, so both your loggers "DataIntakeService" and "EventLogAppender" log to these appenders.
您已配置 Log4Net,以便根记录器记录到文件和事件日志附加程序。所有记录器都继承此配置,因此您的记录器“DataIntakeService”和“EventLogAppender”都记录到这些附加器。
If you don't see log messages in event viewer, it may be because your application doesn't have permission to create the Event source.
如果您在事件查看器中没有看到日志消息,可能是因为您的应用程序没有创建事件源的权限。
UPDATE
更新
How can i configure it so the DataIntakeService logs to the file and the other one to the eventviewer ?
我如何配置它以便 DataIntakeService 记录到文件,另一个记录到事件查看器?
Here's a sample configuration:
这是一个示例配置:
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="LogFileAppender" />
  </root>
  <logger name="EventLogAppender" additivity="False">
    <level value="INFO" />
    <appender-ref ref="EventLogAppender" />
  </logger>
  <appender>
  ... 
With this sample:
使用此示例:
The root logger (and hence all child loggers unless explicitly configured otherwise) will log to
LogFileAppender. YourDataIntakeServicelogger isn't explicitly configured, so inherits this configuration.The
EventLogAppenderlogger is explicitly configured to log toEventLogAppender, and is configured not to inherit settings from parent loggers (additivity="false"). Therefore it doesn't log toLogFileAppender. If you setadditivity="true"it will inherit settings and log to bothLogFileAppenderandEventLogAppender.
根记录器(以及所有子记录器,除非另有明确配置)将记录到
LogFileAppender. 您的DataIntakeService记录器未明确配置,因此继承了此配置。该
EventLogAppender记录器明确配置为登录EventLogAppender,且不是从父记录器配置为继承设置(additivity="false")。因此它不会登录到LogFileAppender. 如果您设置additivity="true",它将继承设置并登录到LogFileAppender和EventLogAppender。
Incidentally, naming a logger EventLogAppenderis perhaps a bit confusing: EventLogLoggermight be a better name.
顺便说一句,命名记录器EventLogAppender可能有点令人困惑:EventLogLogger可能是一个更好的名字。
回答by serefbilge
You can use log4net to write to different loggers by the configuration below.
您可以通过以下配置使用 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>
And you can call the loggers as:
您可以将记录器称为:
private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger");
private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger");

