我在我的log4net配置中为我的应用程序设置了logfileAppender
和consoleAppender
。我希望logfile appender只能写上面的ERROR消息和控制台appender来编写DEBUG及以上版本。
我的配置是:
<log4net debug="false">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<threshold value="ERROR"/>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<root>
<priority value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
我发现ERROR和DEBUG都输出到我的logfile appender。如何将其限制为仅ERROR?
答案 0 :(得分:8)
另请注意,记录器中的level
标记与threshold
或LevelMatchFilter
的工作方式不同。
Level
表示实际生成的日志语句。这是您可以在代码中测试的内容。
Threshold
会过滤掉低于阈值的所有日志消息。
这意味着具有高于最高记录器级别的阈值是没有意义的。我已经多次看到如何设置一个INFO级别(因为这是大多数appender将使用的),然后创建一个具有DEBUG阈值的appender。然后,如果没有DEBUG消息实际出现在appender上,你会感到惊讶......
答案 1 :(得分:6)
要为appender进行非常具体的过滤,您需要为日志文件追加器配置LevelMatchFilter
或LevelRangeFilter
以过滤实际输出的事件。
例如:
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR"/>
<levelMax value="FATAL"/>
</filter>
或
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="ERROR"/>
</filter>
将其中一个放入<appender>
标记中,这应该适合您:
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="ERROR"/>
</filter>
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<threshold value="ERROR"/>
</appender>
注意:已更新以删除kgiannakakis指出的错误。
答案 2 :(得分:4)
我已经使用你的log4net配置创建了一个示例控制台应用程序,并且我得到了你想要的确切行为....
using System;
using System.IO;
using log4net;
using log4net.Config;
namespace SO_1171258
{
class Program
{
private static readonly ILog log = LogManager.GetLogger(typeof(Program));
static void Main()
{
XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString()));
log.Error(new Exception("error log statment"));
log.Debug("debug log statment");
}
}
}
当我运行这个应用程序时,日志文件中唯一的东西是:
2014-01-27 15:02:51,387 Main - System.Exception:错误日志状态
我看到屏幕:
2014-01-27 15:05:52,190 System.Exception:错误日志状态
2014-01-27 15:05:52,218调试日志声明
以下是我的app.config文件的全部内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net debug="false">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<threshold value="ERROR"/>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %m%n" />
</layout>
</appender>
<root>
<priority value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
</configuration>
答案 3 :(得分:2)
您收到的答案部分正确。 Threshold
仅用于设置附加级别的下限。 ERROR的阈值实际上会收到ERROR和FATAL(“高于”ERROR)。
您确实希望实现级别值为“ERROR”的LevelMatchFilter
(以及另一个appender的“DEBUG”)。但是,您还必须在过滤器链的末尾添加DenyAllFilter
例如:
<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d %M - %m%n" />
</layout>
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="ERROR" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
我必须实现DenyAllFilter,因为log4net 1.2.10(你可以看到我对这个主题的问题here)。
答案 4 :(得分:0)
您需要使用additivity属性。有关示例,请参阅here。您需要定义两个记录器。