log4net:配置为忽略来自特定类的消息
Posted
技术标签:
【中文标题】log4net:配置为忽略来自特定类的消息【英文标题】:log4net: Configure to ignore messages from a specific class 【发布时间】:2011-07-27 02:59:23 【问题描述】:有没有办法让 log4net 配置忽略特定的类?例如,我们通常在每个类中创建一个日志。类似这样:
private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");
问题是MyClass
记录了大量的数据,并且很难找到有关其他类的信息。它是另一个使用MyClass
的开发人员,所以我不能只进入并更改日志文件,但在我的环境中我想忽略这些。
我可以将我的configuration
文件设置为忽略来自特定类的消息吗?
【问题讨论】:
【参考方案1】:当然,使用filter.
这是发布在博客上的 sn-p,以供将来参考 - 全部归功于该博客文章的作者:
<filter type="log4net.Filter.LoggerMatchFilter">
<!-- allows this sub-namespace to be logged... -->
<loggerToMatch value="Noisy.Namespace.But.Important" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
<!-- ...but not the rest of it -->
<loggerToMatch value="Noisy.Namespace" />
<acceptOnMatch value="false" />
</filter>
【讨论】:
【参考方案2】:过滤器确实有效,但我更愿意像这样直接关闭记录器(或记录器层次结构):
<logger name="YourNameSpace.WithNoLogging" additivity="false">
<level value="OFF" />
</logger>
<logger name="MyClass" additivity="false">
<level value="OFF" />
</logger>
<root>
<level value="ALL" />
<appender-ref ref="YourAppender" />
</root>
假设YourNameSpace.WithNoLogging
是一个命名空间,那么显示的配置将禁用整个命名空间的日志记录。第二个“示例”会关闭您班级的日志记录(根据您的问题)。
【讨论】:
它是否适用于第 3 方程序集?我试图忽略 RavenDb 消息,到目前为止没有运气 我实际上设法做到了 - 通过指定正在记录的类的全名,不知何故带有星号的命名空间没有做到这一点 Stefan,是的,在服务器端 通配符不起作用,但是你可以指定一个命名空间而不是一个类:那么这个命名空间(和子命名空间)中的所有类都会受到影响 嗨,我认为这只有在您对每个类都使用 getLogger(myclass) 时才有效。如果您在 applicationstart 上生成一个命名记录器并在您的完整应用程序中通过引用使用它,它将不起作用。还是我在这一点上不正确?【参考方案3】:我建议也使用Filters。但是,由于我在尝试实现过滤器时很难找到整个画面,所以我发布了我创建的Configutation file
的示例 sn-p,它指出了过滤器的去向。
在这种情况下,您要使用的过滤器是
log4net.Filter.LoggerMatchFilter ----(匹配一个开始的 记录器名称。)
提示:在 Log4Net 的 config
文件中,放置标签的位置很重要,它们的优先级实际上很重要。因此,在这种情况下,<filter>
标记位于 <appender>
opening 标记之后和 <file value = ... />
标记之前。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFile.PassedDevices" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="Foo.namespace.bar.mySubclass" />
<acceptOnMatch value="false" />
</filter>
<file value="myPassedDevices.log" />
<appendToFile value="true" />
<maximumFileSize value="100KB" />
<maxSizeRollBackups value="2" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%timestamp %level - %message [%thread] %logger%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFile" /> <!-- My other appender which logs all and I cut it out in this snippet. Remember that you should reference all your appenders in this tag to make them work.-->
<appender-ref ref="RollingFile.PassedDevices" />
</root>
</log4net>
</configuration>
在这种技术中,您可以拥有多个appenders
,您可以将特定记录器的日志记录结果重定向到单独的appender
,而不是忽略它们。例如一个appender
用于所有日志,一个用于过滤掉的特定class
的日志。
【讨论】:
【参考方案4】:您可能想尝试将类别应用于您自己的消息 试试这个线程: How to add category prefix to log4net message?
【讨论】:
感谢您的提示。我的过滤器无法正常工作,直到我将它移到“文件值 =...”之前【参考方案5】:如果您使用 NHibernate 和 log4net,只想发布常见的排除项。请注意,每个过滤器都需要自己的元素。
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="NHibernate.Engine.StatefulPersistenceContext.ProxyWarnLog" />
<acceptOnMatch value="false" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="NHibernate.LazyInitializationException" />
<acceptOnMatch value="false" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="NHibernate.Cache.NoCacheProvider" />
<acceptOnMatch value="false" />
</filter>
【讨论】:
以上是关于log4net:配置为忽略来自特定类的消息的主要内容,如果未能解决你的问题,请参考以下文章
如何配置log4net以便log.IsDebugEnabled为true