【问题标题】:How to set Quartz.net worker thread name?如何设置 Quartz.net 工作线程名称?
【发布时间】:2009-12-15 15:32:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net log4net scheduling quartz.net


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,这纯粹是为了调试目的,而且我认为命名这些线程(至少前缀)将有助于稍后在出现问题时审核日志
      【解决方案3】:

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

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

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

      我找到了这门课。 source
      这是记录计算上下文的 lambda / func 方式:log4net context explained

      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 将在运行时确定并记录在自己的属性中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 2019-12-19
        • 2011-01-23
        相关资源
        最近更新 更多