无论使用log4net,都记录一些信息

时间:2011-05-09 05:56:35

标签: c# logging log4net

情况是log4net的级别被配置为'Error'但是我需要在'无论什么'条件下写一些信息 例如

“登录已开始” 如果仅启用'错误'或'致命',我无法将此记录为错误或致命,因为它只是信息

除了将记录器的级别更改为info,写入日志然后更改回级别之外,还有什么办法可以做到这一点,因为这样做就像解决方法而不是解决方案

并且没有使用Headers,因为它们只是在开头

编辑:在Appender中

StringMatchFilter stringFilter = new StringMatchFilter();
stringFilter.AcceptOnMatch = true;
stringFilter.StringToMatch = "successfully";
stringFilter.ActivateOptions();
appender.AddFilter(stringFilter);

DenyAllFilter deny = new DenyAllFilter();
deny.ActivateOptions();
appender.AddFilter(deny);

添加到appender并将“All”级别设置为root并管理appender中的级别,但仍然无法编写任何包含“success”的消息 但请注意,当我将appender级别设置为信息时,过滤器开始工作

2 个答案:

答案 0 :(得分:2)

我认为这都是因为你不喜欢使用.FatalFormat的想法,因为它不是真的错误。

我不确定如何以编程方式执行此操作,但如果您使用配置文件,则添加类似

的部分
    <logger name="ALWAYS">
        <level value="DEBUG" />
        appender-ref ref="RollingFileAppender" />
    </logger>

这意味着您可以记录您的消息,如

   log4net.LogManager.GetLogger("Always").InfoFormat( ... );

或者您可以创建静态

   static readonly log4net.ILog alwaysLogger  = log4net.LogManager.GetLogger("Always");

并登录。

   alwaysLogger.InfoFormat(....);

答案 1 :(得分:1)

我的建议是创建一个首先查找字符串匹配然后在该级别查找的过滤器。这样你就可以拥有一个你在消息中传递的密钥字符串(比如“AppInfo”或者是一个独特的,在错误中找不到的东西)。然后,即使您在INFO级别记录它,您的过滤器也会选择并记录它,但过滤器会忽略所有其他不是ERROR或FATAL的消息。我在CodeProject上写了一篇文章,它将向您展示如何进行这样的复杂过滤:

http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx

这里的一个关键是你可能不需要在root中为这个特定的appender指定过滤,因为如果我没记错的话,root会取代appender。