我的应用程序登录到控制台和文件(log4net 1.2.11):
<root>
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="RollingLogFileAppender" />
</root>
我想更改一个类的配置,以便将所有消息记录到文件,并将所有消息记录到控制台。我可以不为我的课程添加专用的appender,也不需要更改root配置,例如在记录器的appender-ref级别?
受this answer的启发,我尝试了下面的代码,但没有成功(所有消息,包括Debug,都记录到两个appender):
<logger name="MyClass" additivity="false">
<appender-ref ref="ConsoleAppender">
<threshold value="INFO" />
</appender-ref>
<appender-ref ref="RollingLogFileAppender" />
</logger>
这也失败了(它从所有appender中排除了Debug,我想在文件中调试消息):
<logger name="MyClass">
<level value="INFO" />
</logger>
答案 0 :(得分:1)
你运气不好,当log4net解析appender-ref
标签时,它没有将任何信息传递给名称引用的appender(代码来自1.2.10):
// log4net.Repository.Hierarchy.XmlHierarchyConfigurator
if (xmlElement.LocalName == "appender-ref")
{
IAppender appender = this.FindAppenderByReference(xmlElement);
string attribute = xmlElement.GetAttribute("ref");
if (appender != null)
{
LogLog.Debug(string.Concat(new string[]
{
"XmlHierarchyConfigurator: Adding appender named [",
attribute,
"] to logger [",
log.Name,
"]."
}));
log.AddAppender(appender);
}
else
{
LogLog.Error("XmlHierarchyConfigurator: Appender named [" + attribute + "] not found.");
}
}
我很确定你所链接的答案并不真正有用; appender上存在Treshold
属性,但它不在ref节点中解析。
哪个是最好的 - 如果记录器可以从其引用改变一些appender属性,你能想象配置的噩梦吗?正在解析的最后一个记录器将赢得配置和好运跟踪为什么你的调试appender现在保持沉默,因为其他记录器交换了阈值:)
所以你必须添加另一个appender;如果您不想复制粘贴RollingLogFileAppender配置,则可以使用forwarding appender作为过滤器,然后将消息传递给自己引用的appender。你最终会得到