有没有办法让log4net配置忽略特定的类?例如,我们通常在每个类中创建一个日志。与此类似:
private static readonly ILog Log = log4net.LogManager.GetLogger("MyClass");
问题是MyClass
记录了大量数据,很难找到有关其他类的信息。它是另一个使用MyClass
的开发人员所以我不能只是进入并更改日志文件,但在我的环境中我想忽略这些。
我可以将configuration
文件设置为忽略来自特定类的消息吗?
答案 0 :(得分:71)
当然,请使用filter.
以下是博客上发布的片段,供将来参考 - 所有归功于该博客文章的作者:
<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>
答案 1 :(得分:54)
过滤器肯定有效,但我更喜欢直接关闭记录器(或记录器层次结构),如下所示:
<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
是名称空间,则显示的配置将禁用整个名称空间的日志记录。第二个“示例”会关闭您班级的日志记录(根据您的问题)。
答案 2 :(得分:14)
我建议也使用Filters。但是,由于我在尝试实现过滤器时难以找到整个图片,因此我发布了一个我创建的Configutation file
的示例片段,指出过滤器的位置。
在这种情况下,您正在进行过滤的过滤器将是
对于 Log4Net 的log4net.Filter.LoggerMatchFilter ----(与...的开头相匹配 记录器名称。)
config
文件中的 提示,重要的是放置标签并确保其优先级非常重要。因此,在这种情况下,<filter>
标记位于<appender>
开头标记之后且位于<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
的已过滤日志有一个。{/ p>
答案 3 :(得分:2)
您可能想尝试将类别应用于自己的消息 试试这个帖子: How to add category prefix to log4net message?
答案 4 :(得分:0)
如果您正在使用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>