我配置了两个记录器并希望它们同时记录到事件日志和文本文件,但它们都记录到文本。 这是我的配置文件:
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="NavRiskFileImportError.log" />
<appendToFile value="true" />
<maximumFileSize value="100KB" />
<maxSizeRollBackups value="2" />
<datePattern value="yyyyMMdd" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="{%level}{%date} – %message%newline"/>
</layout>
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<param name="ApplicationName" value="NavriskFromExcel" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<!--loggers-->
<logger name="FileLogger">
<level value="ALL" />
<appender-ref ref="RollingFile" />
</logger>
<logger name="EventLogger">
<level value="ALL" />
<appender-ref ref="EventLogAppender" />
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="EventLogAppender" />
<appender-ref ref="RollingFile" />
</root>
</log4net>
在我的申请中,我有:
private static ILog logger= LogManager.GetLogger("FileLogger");
private static ILog eventLogger= LogManager.GetLogger("EventLogger");
但是两个记录器都在向文件写入数据而在事件日志中没有任何内容。我做错了什么?
答案 0 :(得分:4)
您必须在各个记录器上指定additivity="false"
,否则它们会从根记录器继承appender:
默认情况下,Additivity设置为true,即子项继承 默认情况下他们祖先的追随者。如果此变量设置为 false然后在此记录器的祖先中找到的appender不是 使用过(source)
这意味着:
<logger name="EventLogger" additivity="false">
这解释了为什么两者都写入文件。
所以剩下的问题是EventLogAppender无法正常工作的原因。您可以使用以下代码检查配置错误:
var messages = LogManager.GetRepository().ConfigurationMessages.Cast<LogLog>();
if (messages.Any())
{
string message = messages.Aggregate("Log4net Configuration Errors: "
+ Environment.NewLine,
(s, log) => s + log.Message + Environment.NewLine);
}
如果没有显示任何内容,enable log4net internal debugging并检查输出。
编辑:文档说明EventLogAppender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges,但事件源需要由提升的进程创建,或者installer - 每台计算机必须创建一次事件源。