使用log4net写入不同的日志记录器

20

我正在使用log4net来记录日志。我希望它能同时写入文件和事件日志。

但是,不知道为什么我在日志文件中看到了重复的消息。

这是我的app.config配置节:

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

如我所请求,它记录到我的日志文件中,但消息也应该发送到我的事件查看器,而这并没有发生。它也将这些消息写入日志文件中。

我错在哪里了?

2个回答

39
你已经配置了Log4Net,使根记录器同时记录到文件和事件日志附加程序中。 所有记录器都继承这个配置,所以你的两个记录器“DataIntakeService”和“EventLogAppender”都会记录到这些附加程序中。
如果在事件查看器中没有看到日志消息,可能是因为你的应用程序没有权限创建事件源。 更新 “如何配置DataIntakeService记录到文件并让另一个记录到事件查看器?” 这里有一个示例配置:
<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作为名称可能更好。


1
我该如何配置它,使DataIntakeService记录到文件中,而另一个记录到事件查看器中? - Bart Schelkens
2
这是一个很好的解释,谢谢。只是为了澄清一下,如果没有指定additivity,那么默认值是True,对吗? - Ben
2
@Ben,是的,addivity默认为true:https://logging.apache.org/log4net/release/sdk/log4net.Repository.Hierarchy.Logger.Additivity.html - Joe

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接