Log4net - 修改单个记录器和附加器组合的日志记录级别
Log4net - modify logging levels for individual logger and appender combinations
我有两个附加程序,一个 (InfoAppender) 带有 levelMin 信息过滤器,另一个 (DebugAppender) 没有过滤器。这很好用。我还可以使用该元素为各个记录器设置最低日志记录级别。但现在我想让大多数记录器将信息(及以上)记录到 InfoAppender 并将调试(及以上)记录到 DebugAppender,但某个聊天记录器 (NHibernate) 将警告(及以上)记录到 InfoAppender,并将信息(及以上)记录到 DebugAppender。
我查看了Log4Net Logging of two different levels to two different appenders for the same logger中提供的解决方案,但它对我不起作用。我有以下配置:
<log4net>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'Info.'yyyy-MM-dd'.log.txt'"/>
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
</filter>
</appender>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'Debug.'yyyy-MM-dd'.log.txt'"/>
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<logger name="NHibernate" additivity="false">
<appender-ref ref="InfoAppender">
<threshold value="WARN" />
</appender-ref>
<appender-ref ref="DebugAppender">
<threshold value="INFO" />
</appender-ref>
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="DebugAppender" />
</root>
</log4net>
我有以下测试代码:
XmlConfigurator.Configure();
var logger1 = LogManager.GetLogger("Program");
var logger2 = LogManager.GetLogger("NHibernate");
logger1.Debug("Debug message");
logger2.Debug("Debug message");
logger1.Info("Info message");
logger2.Info("Info message");
logger1.Warn("Warn message");
logger2.Warn("Warn message");
但是调试消息都记录到 DebugAppender,信息消息都记录到 InfoAppender。
log4net的配置机制是比较宽松的,但是在没有考虑到一些参数的时候不会告诉你。例如,在您的配置中,以下引用附加程序 InfoAppender
但阈值 属性 不执行任何操作
<appender-ref ref="InfoAppender">
<threshold value="WARN" />
</appender-ref>
appender-ref
节点下的 xml 元素未被解析,您可以放置任何不会被考虑在内的内容:
protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot)
// some code ommited
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.");
}
}
您需要做的是在记录器和最终附加器之间添加一个过滤器。为此,我建议使用 ForwardingAppender
,它允许您在附加程序之间传递日志事件,同时添加一些行为:将配置文件的 NHibernate 部分更改为:
<appender name="NHibernateDebugFilterAppender" type="log4net.Appender.ForwardingAppender">
<appender-ref ref="DebugAppender"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
</filter>
</appender>
<appender name="NHibernateInfoFilterAppender" type="log4net.Appender.ForwardingAppender">
<appender-ref ref="InfoAppender"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="WARN" />
</filter>
</appender>
<logger name="NHibernate" additivity="false">
<appender-ref ref="NHibernateInfoFilterAppender" />
<appender-ref ref="NHibernateDebugFilterAppender"/>
</logger>
我有两个附加程序,一个 (InfoAppender) 带有 levelMin 信息过滤器,另一个 (DebugAppender) 没有过滤器。这很好用。我还可以使用该元素为各个记录器设置最低日志记录级别。但现在我想让大多数记录器将信息(及以上)记录到 InfoAppender 并将调试(及以上)记录到 DebugAppender,但某个聊天记录器 (NHibernate) 将警告(及以上)记录到 InfoAppender,并将信息(及以上)记录到 DebugAppender。
我查看了Log4Net Logging of two different levels to two different appenders for the same logger中提供的解决方案,但它对我不起作用。我有以下配置:
<log4net>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'Info.'yyyy-MM-dd'.log.txt'"/>
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
</filter>
</appender>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'Debug.'yyyy-MM-dd'.log.txt'"/>
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<logger name="NHibernate" additivity="false">
<appender-ref ref="InfoAppender">
<threshold value="WARN" />
</appender-ref>
<appender-ref ref="DebugAppender">
<threshold value="INFO" />
</appender-ref>
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="DebugAppender" />
</root>
</log4net>
我有以下测试代码:
XmlConfigurator.Configure();
var logger1 = LogManager.GetLogger("Program");
var logger2 = LogManager.GetLogger("NHibernate");
logger1.Debug("Debug message");
logger2.Debug("Debug message");
logger1.Info("Info message");
logger2.Info("Info message");
logger1.Warn("Warn message");
logger2.Warn("Warn message");
但是调试消息都记录到 DebugAppender,信息消息都记录到 InfoAppender。
log4net的配置机制是比较宽松的,但是在没有考虑到一些参数的时候不会告诉你。例如,在您的配置中,以下引用附加程序 InfoAppender
但阈值 属性 不执行任何操作
<appender-ref ref="InfoAppender">
<threshold value="WARN" />
</appender-ref>
appender-ref
节点下的 xml 元素未被解析,您可以放置任何不会被考虑在内的内容:
protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot)
// some code ommited
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.");
}
}
您需要做的是在记录器和最终附加器之间添加一个过滤器。为此,我建议使用 ForwardingAppender
,它允许您在附加程序之间传递日志事件,同时添加一些行为:将配置文件的 NHibernate 部分更改为:
<appender name="NHibernateDebugFilterAppender" type="log4net.Appender.ForwardingAppender">
<appender-ref ref="DebugAppender"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
</filter>
</appender>
<appender name="NHibernateInfoFilterAppender" type="log4net.Appender.ForwardingAppender">
<appender-ref ref="InfoAppender"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="WARN" />
</filter>
</appender>
<logger name="NHibernate" additivity="false">
<appender-ref ref="NHibernateInfoFilterAppender" />
<appender-ref ref="NHibernateDebugFilterAppender"/>
</logger>