c# - Log4net EventLogAppender 只能在根记录器中工作,为什么?

标签 c# logging log4net log4net-configuration log4net-appender

我有一个控制台应用程序,我正在尝试使用 EventLogAppender 通过 log4net 记录到 Windows 事件日志。我还有两个 RollingFileAppender,但它们工作正常。

RollingFileAppender 位于根记录器中,配置如下:

<root>
  <level value="DEBUG" />
  <appender-ref ref="RollingFileAppenderInfo" />      
  <appender-ref ref="RollingFileAppenderDebug" />
</root>

EventLogAppender位于名为EventLogger的记录器中,配置如下:

<logger Name="EventLogger">
  <level value="INFO" />
  <appender-ref ref="EventLogAppenderInfo"/>
  <appender-ref ref="EventLogAppenderError"/> 
</logger>

这样,EventLogger 就会从 root 继承附加程序。如果我使用 EventLogger 记录某些内容,它也会被写入日志文件。我之所以这样做,是因为我不想向 Windows 事件日志发送所有信息条目,而只发送重要的信息条目。但我也想记录每个错误。

这就是我获取记录器的方式:

private static readonly log4net.ILog eventLog = log4net.LogManager.GetLogger("EventLogger");

问题

像这样配置,使用eventlog对象记录任何级别的内容,log4net不会写入Windows事件日志,而是写入日志文件,因此root中的appender是工作。

如果我将 EventLogAppender 置于根目录,它们会正常工作,但它们也会记录我不想记录到事件日志中的 INFO 级别条目。

我认为这不是权限问题,源已经创建并且可以访问。

如果有人好奇的话,这是两个 EventLogAppender:

<appender name="EventLogAppenderInfo" type="log4net.Appender.EventLogAppender">
  <applicationName value="ApplicationName" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{yyyy.MM.dd HH:mm:ss} [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
  <filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="INFO"/>
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

<appender name="EventLogAppenderError" type="log4net.Appender.EventLogAppender">
  <applicationName value="ApplicationName" />
  <layout type="log4net.Layout.PatternLayout">
    <IgnoresException value="False"/>
    <conversionPattern value="%date{yyyy.MM.dd HH:mm:ss} [%thread] %-5level %logger [%property{NDC}] - %message%newline%exception" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="WARN" />
    <levelMax value="FATAL" />
  </filter>
</appender>

我想不出 log4net 这样做的原因,如果有人有解决方案,将不胜感激!

干杯!

最佳答案

我认为这是一个区分大小写的问题。

<logger Name="EventLogger">

应该是

<logger name="EventLogger">

关于c# - Log4net EventLogAppender 只能在根记录器中工作,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46347744/

相关文章:

c# - 提交表单时复选框列表丢失

c# - 将变量传递给 JS 文件

c# - .NET Core 平台中Log4Net Layout.XmlLayout 不创建日志

logging - GKE-堆栈驱动程序

logging - 发生异常时记录什么?

c# - 防止委托(delegate)被垃圾收集

python - PythonAnywhere 上 Flask 的日志记录格式

c# - log4Net XmlHierarchyConfigurator

Log4Net:什么时候获取和释放文件句柄?

log4net - LOG4NET 中的 ALL 和 DEBUG 跟踪级别有什么区别