【问题标题】:log4net - confgure to ignore messages from a specific threadlog4net - 配置忽略来自特定线程的消息
【发布时间】:2012-09-18 08:15:45
【问题描述】:

是否有可能从特定线程中过滤掉日志条目?

我使用 nunit 来运行测试(c#):

using System;
using NUnit.Core;
using log4net;

namespace Main
{
    public class Program
    {
        public static readonly ILogger log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            log.Info("start");

            TestPackage package = new TestPackage(@"C:\Test\Main.Tests.dll");
            RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
            remoteTestRunner.Load(package);
            TestResult result = remoteTestRunner.Run(new NullListener(), TestFilter.Empty, true, LoggingThreshold.All);

            log.Info("end");
        }
    }
}

这是我得到的日志:

INFO  17:57:24 [1] Main.Program - start
ERROR 17:57:25 [TestRunnerThread] Main.TestedClass - Exception! Relevant for production / okay in test
INFO  17:57:26 [1] Main.Program - end

log4net 每次记录错误时都会向我发送一封邮件。如果我运行测试,我不想收到这些邮件。 nunit 将线程名称设置为:“TestRunnerThread”。我怎样才能忽略这个帖子?

我读过这个:How to log into separate files per thread with Log4Net? 并尝试了这个过滤器(根本没有日志):

<filter type="log4net.Filter.PropertyFilter">
    <key value="threadId" />
    <stringToMatch value="TestRunnerThread" />
    <acceptOnMatch value="false" />
</filter>

【问题讨论】:

  • 为什么不在测试环境中配置另一组appender?
  • 您尝试的方法不仅需要将 threadName 设置为 TestRunnerThread,还需要设置 log4net 属性,例如 log4net.ThreadContext.Properties["threadId"] = "TestRunnerThread";,Nunit 不太可能这样做。
  • @WiktorZychla:这将是程序的自测。一些测试检查配置是否正确。程序特定配置和 log4net-config 都在同一个文件 (app.config) 中。我将尝试在 self-test-mode 中动态禁用附加程序。
  • @sgmoore:是的。 Nunit 不会这样做。但我虽然:如果 log4net 可以通过%threadconversionPattern 中向我显示“TestRunnerThread”,那么它也应该可以过滤。
  • propertyFilter 仅适用于属性,%thread 不是属性,而是称为“转换模式名称”的东西,我认为没有办法过滤这些“转换模式名称” .

标签: c# logging nunit log4net log4net-filter


【解决方案1】:

一些事情:

  • 如您链接到的the answerthe question 中所述,您必须使用 ThreadContext 注册一个键值对才能使过滤器键起作用:ThreadContext.Properties["threadId"] = "1"
  • 过滤顺序很重要。来自docs

    过滤器形成一个事件必须通过的链。一路上的任何过滤器都可以接受事件并停止处理,拒绝事件并停止处理,或允许事件进入下一个过滤器。如果事件在没有被拒绝的情况下到达过滤器链的末尾,则它被隐式接受并被记录。

    确保过滤器顺序如下:

    1. 过滤你想要的线程
      • 如果匹配,则消息被拒绝并且传递给下一个过滤器(由于&lt;acceptOnMatch value="false" /&gt;
      • 如果不匹配,则将消息传递到链中的下一个过滤器
    2. 记录器过滤器
      • 如果匹配,则接受消息并且传递给下一个过滤器
      • 如果不匹配,则将消息传递到链中的下一个过滤器
    3. 全部拒绝
      • 消息被拒绝

完整示例:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
    <appender type="log4net.Appender.ConsoleAppender" name="consoleApp">
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message%newline" />
        </layout>       
        <filter type="log4net.Filter.PropertyFilter">
            <key value="threadId" />
            <stringToMatch value="3" />
            <acceptOnMatch value="false" />
        </filter>
        <filter type="log4net.Filter.LoggerMatchFilter">
            <loggerToMatch value="sandbox" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
    <root>
        <level value="ALL" />
        <appender-ref ref="consoleApp" />
    </root>
</log4net>
static void Main(string[] args)
{
    XmlConfigurator.Configure(new FileInfo("config.xml"));

    ILog log = LogManager.GetLogger("sandbox");

    ThreadPool.QueueUserWorkItem(a =>
    {
        ThreadContext.Properties["threadId"] = "1";
        log.Debug("one");
    });

    ThreadPool.QueueUserWorkItem(a =>
    {
        ThreadContext.Properties["threadId"] = "2";
        log.Debug("two");
    });

    ThreadPool.QueueUserWorkItem(a =>
    {
        ThreadContext.Properties["threadId"] = "3";
        log.Debug("three");
    });

    Console.Read();
}

将记录:

one
two

(可能以不同的顺序,取决于哪个线程先完成)

【讨论】:

    【解决方案2】:

    我没有使用 log4net,但一个简单的建议是将 id 更改为 fake@fake.com 之类的东西,在您指定电子邮件 ID 的地方接收日志记录电子邮件...

    同意应该进行一些配置以不每次都发送电子邮件,但这可能是一种解决方法,直到您找到合适的解决方案

    当您使用日志记录时,我还建议您查看 Microsoft 企业库日志记录应用程序块。在您的应用程序中配置和使用非常容易。

    链接http://msdn.microsoft.com/en-us/library/ff664569(v=pandp.50).aspx

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多