如何在 Quartz.net 中设置工作线程的名称?
[2009-12-15 08:56:25] [DefaultQuartzScheduler_Worker-1] INFO
我想在日志中看到一些有意义的信息。我尝试使用JobDetail
构造函数,但看起来我错了。
var job = new JobDetail("n1", null, typeof (MyJob));
如何在 Quartz.net 中设置工作线程的名称?
[2009-12-15 08:56:25] [DefaultQuartzScheduler_Worker-1] INFO
我想在日志中看到一些有意义的信息。我尝试使用JobDetail
构造函数,但看起来我错了。
var job = new JobDetail("n1", null, typeof (MyJob));
至少没有办法设置工作线程的名称。但是,我使用 log4net 的 %property 工具在日志文件中生成有意义的线程名称
通常您会对作业输出的内容感兴趣(它们应该有自己的记录器),而不是对线程感兴趣。
您是否有需要线程逻辑名称的特定情况?线程是池化的,不能保证哪个线程可以处理什么样的工作。这就是为什么线程名称通常仅可用于调试目的,以跟踪特定线程生命周期中发生的事情。
这是对旧问题的新答案,但可能对某人有所帮助。
我不喜欢日志文件中的长石英线程名称 [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 将在运行时确定并记录在其自己的属性中。