<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的配置机制相当宽松,但不会告诉您什么时候没有考虑某些参数。例如,在您的配置中,下面引用了appenderInfoAppender
,但是threshold属性不做任何事情
<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>
现在,问题是,当我以以下方式进行日志记录时: 尽管根记录器级别被设置为“错误”,但日志条目仍然存在于两个日志文件中。然而,当我去掉“it.pkg.testpkg.service”记录器(通过注释或删除它)时,条目停止进入根记录器。我不太清楚这是怎么回事。 目前,我已经找到了一个临时解决方案,方法是在“root_file_appender”中添加以下条目: 谢了。
我想做的很直截了当: 我只希望在控制台追加器上显示重要的消息,而我希望将详细的消息路由到文件追加器。 我还尝试向添加一个ThresholdFilter,但这也不能过滤它。
我们有两个不同的ASP.NET应用程序启用了Log4net日志记录。它们都有相同的log4net1.2.10.0版本。
我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?
我正在尝试使用log4net将性能记录器分离到一个单独的日志中... 一旦我有了这个设置,我将错误记录到我的滚动日志文件中,然而我想捕获一些信息级别的数据到我的perf文件中... 我现在得到我的信息和警告在我的Perf日志,但我也得到我的错误在那里,它可能得到我的错误在我的主日志和我的信息级别在我的Perf日志?
我使用的是播放框架,其中日志是默认的记录器引擎。为了便于跟踪,我希望将两个不同的活动(和)记录在两个单独的文件中。为此,我有两个追加器和两个记录器。每个记录器都用特定的appender标记。 我希望通过事务记录器(如登录或注册相关活动(如 但不管用。有什么想法吗? 我所说的“不工作”是指相同的日志被附加到两个记录器中,而不是特定于特定的日志。例如。如果我从播放代码调用,事务和登录记录器都将用户X已