2

如何在 Quartz.net 中设置工作线程的名称?

[2009-12-15 08:56:25] [DefaultQuartzScheduler_Worker-1] INFO

我想在日志中看到一些有意义的信息。我尝试使用JobDetail构造函数,但看起来我错了。

var job = new JobDetail("n1", null, typeof (MyJob));
4

3 回答 3

1

至少没有办法设置工作线程的名称。但是,我使用 log4net 的 %property 工具在日志文件中生成有意义的线程名称

于 2009-12-19T05:47:38.080 回答
0

通常您会对作业输出的内容感兴趣(它们应该有自己的记录器),而不是对线程感兴趣。

您是否有需要线程逻辑名称的特定情况?线程是池化的,不能保证哪个线程可以处理什么样的工作。这就是为什么线程名称通常仅可用于调试目的,以跟踪特定线程生命周期中发生的事情。

于 2009-12-17T10:42:11.110 回答
0

这是对旧问题的新答案,但可能对某人有所帮助。

我不喜欢日志文件中的长石英线程名称 [DefaultQuartzScheduler_Worker-1]。

相反,我希望 log4net 显示线程 ID。因此,您需要设置一个记录当前线程 ID 的属性。

我找到了这堂课。来源
这是一种记录计算上下文的 lambda / func 方式:log4net 上下文解释

public class Log4NetContextProperty : IFixingRequired
{
    private readonly Func<string> _getValue;

    public Log4NetContextProperty(Func<string> getValue)
    {
        _getValue = getValue;
    }

    public override string ToString()
    {
        return _getValue();
    }

    public object GetFixedObject()
    {
        return ToString();
    }
}

你必须在你的应用程序开始的地方这样称呼它。

log4net.GlobalContext.Properties["threadId"] = new Log4NetContextProperty(() => Thread.CurrentThread.ManagedThreadId.ToString());

然后在您的 log4net 配置中调整转换模式以包含新属性。我的看起来像这样:

<conversionPattern value="%d{dd.MM.yyyy HH:mm:ss,ffff} %-5level [%property{threadId}] - %message%newline" />

就是这样。这样,每个线程的 id 将在运行时确定并记录在其自己的属性中。

于 2013-06-14T06:40:24.613 回答