【问题标题】:Turn off Debug Logging in Quartz .Net关闭 Quartz .Net 中的调试日志记录
【发布时间】:2009-05-18 11:15:58
【问题描述】:

我正在使用 Quartz.NET 在我们的应用程序中安排一些自定义任务。一切正常,只是它在一秒钟内记录了大约 20 个调试条目。

我不知道如何关闭调试日志记录。任何帮助都将不胜感激,因为我一直在尝试在网上查找但没有运气。

调试条目如下所示

DEBUG 2009-05-12 03:24:14,000 8612670ms StdRowLockSemaphore    ObtainLock         - Lock 'TRIGGER_ACCESS' is desired by: SchedulerFactory_QuartzSchedulerThread
DEBUG 2009-05-12 03:24:14,029 8612699ms StdRowLockSemaphore    ExecuteSQL         - Lock 'TRIGGER_ACCESS' is being obtained: SchedulerFactory_QuartzSchedulerThread
DEBUG 2009-05-12 03:24:14,029 8612699ms StdRowLockSemaphore    ObtainLock         - Lock 'TRIGGER_ACCESS' given to: SchedulerFactory_QuartzSchedulerThread
DEBUG 2009-05-12 03:24:14,034 8612704ms StdRowLockSemaphore    ReleaseLock        - Lock 'TRIGGER_ACCESS' returned by: SchedulerFactory_QuartzSchedulerThread
DEBUG 2009-05-12 03:24:14,035 8612705ms StdRowLockSemaphore    ObtainLock         - Lock 'TRIGGER_ACCESS' is desired by: SchedulerFactory_QuartzSchedulerThread
DEBUG 2009-05-12 03:24:14,035 8612705ms JobRunShell            Run                - Calling Execute on job DEFAULT.ProcessIncomingMTRJob

【问题讨论】:

    标签: .net quartz.net


    【解决方案1】:

    Rytmis' answer 非常适合如果您想减少通过通用日志记录基础架构的所有日志记录。

    但是,如果您通过 Common Logging 有更多的代码日志记录,并且您只想减少 Quartz 的日志记录量(而不是您的代码的其余部分),我建议这样做:

    在 log4net 配置 xml(通常为app.config)中,您可能已经有这样的内容:

        <root>
            <level value="ALL" />
            <appender-ref ... />
            ...
        </root>
    

    保持原样。之后(或&lt;log4net&gt; 配置部分内的任何地方)只需添加以下内容:

        <logger name="Quartz">
            <level value="ERROR" />
        </logger>
    

    &lt;logger&gt; 部分将使用命名空间“Quartz”配置所有记录器。所以在这个例子中,Quartz 将使用级别 ERROR 进行日志记录,而我的应用程序的其余部分将使用级别 ALL 进行日志记录。

    【讨论】:

    • 其实问题不是如何提高你的一般日志级别,因此,这应该被标记为答案,因为这是解决问题。
    • 如何以编程方式执行此操作?
    【解决方案2】:

    如果有人需要在 NLog 中执行此操作,只需在 NLog.Config 中添加以下作为最顶层的规则

    <!-- Disable Quartz info logging -->
    <logger name="Quartz*" minlevel="Trace" maxlevel="Info" final="true" />
    

    请注意,如果您不希望将 maxlevel="Info" 更改为 maxlevel="Fatal",这仍然会让 Warn、Error、Fatal 转到其他记录器

    【讨论】:

    • 嘿,我试过你的建议,但它禁用了所有的 athers 规则,你能更详细地解释一下如何正确使用它吗?
    • 你应该把它放在所有其他记录器之上,还要确保你的类都不是在命名空间中或者有一个以 Quartz 开头的类名,因为它会禁用那些。它的作用是告诉 NLog 忽略所有名称以 Quartz 开头的记录器。
    • 我可能会发布问题
    【解决方案3】:

    Quartz.net 使用 Common.Logging,所以在你的 App.config/Web.config 中是这样的:

    <configSections>
        <sectionGroup name="common">
            <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
        </sectionGroup>
    </configSections>
    
    <common>
        <logging>
            <factoryAdapter type="Common.Logging.Simple.**youradapterhere**, Common.Logging">
                <arg key="level" value="ERROR" />
            </factoryAdapter>
        </logging>
    </common>
    

    请务必将 youradapterhere 更改为您正在使用的实际日志适配器,或者如果您想完全禁用日志记录,则为 NoOpLoggerFactoryAdapter。


    ** 编辑:** 基于 Ganesh 的评论:

    <sectionGroup name="common"> 
        <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/> 
    </sectionGroup> 
    <common>  
        <logging>  
            <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">  
                <arg key="configType" value="INLINE"/>  
                <arg key="configFile" value="filename"/>  
                <arg key="level" value="ERROR" /> <!-- add this line here -->
            </factoryAdapter>  
        </logging> 
    </common>
    

    ** 编辑 2:**

    为了那些不想阅读 cmets 的人的好处,日志级别实际上是在 log4net 根配置中设置的:

    <log4net>
        <root>
            <level value="DEBUG" /> <!-- This is the value that needed changing -->
            <appender-ref ref="Console" />
            <appender-ref ref="RollingFile" />
        </root>
    </log4net>
    

    【讨论】:

    • 我们已经在我们的 ASP .Net 应用程序中使用 Common.Logging。 web.config 中的条目如下所示。你能帮我看看我在哪里添加你建议的条目
    • 我用您的配置编辑了我的答案并添加了相关行。
    • 我们还记录了 Quartz .net 作为计划作业调用的组件的信息。是否可以在键中指定多个值 这是否可能 感谢您的帮助
    • Log4Net 文档说如下:“如果 L >= K,则在具有(分配或继承,以适当者为准)级别 K 的记录器中启用级别 L 的日志请求。此规则位于log4net 的核心。它假设级别是有序的。对于标准级别,我们有 DEBUG
    • 根据您的建议,我在 web.config 的推荐位置添加了指定的行,但 Quartz .Net 仍在打印 DEBUG 日志消息。我添加的行是 关于它为什么不起作用的任何想法?
    【解决方案4】:

    在我关闭 Quartz.net 日志记录的情况下,我只需在配置调度程序的 C# 代码中添加此属性。

    LogProvider.IsDisabled = true;

    总览:

    public static async void Start()
        {
    
            LogProvider.IsDisabled = true;
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler = await schedulerFactory.GetScheduler();
            await scheduler.Start();
    
            IJobDetail job = JobBuilder.Create<SendNotificationJob>().Build();
    
            ITrigger trigger = TriggerBuilder.Create()
    
                .WithDailyTimeIntervalSchedule
                  (s =>
                     s.WithIntervalInSeconds(1)
                    .OnEveryDay()
                    .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
                  )
                .Build();
    
            await scheduler.ScheduleJob(job, trigger);
        }
    

    不要忘记使用:

    using Quartz.Logging;
    

    【讨论】:

      【解决方案5】:

      对于那些在使用 NLog (nlog.config) 时根本不想要 Quartz 日志记录的人(即在作业代码中自己的日志记录就足够了):

      <?xml version="1.0" encoding="utf-8" ?>
      <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            autoReload="true"
            internalLogLevel="info"
            internalLogFile="path_to_nlog_log_file">
      
        <!-- the targets to write to -->
        <targets async="true">
          <target name="database" type="Database">
            <commandText>
              <!-- insert into some table -->
            </commandText>
            <!-- parameters here -->
          </target>    
      
          <target xsi:type="Null" name="blackhole" />
        </targets>
      
        <!-- rules to map from logger name to target -->
        <rules>
          <!--Skip Microsoft/Quartz logs and so log only own logs-->
          <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
          <logger name="Quartz*" minlevel="Trace" maxlevel="Info" writeTo="blackhole" final="true" />
          <logger name="*" minlevel="Debug" writeTo="database" />
        </rules>
      </nlog>
      

      【讨论】:

        【解决方案6】:

        如果你只想删除丰富的信息和调试日志,我会添加

        <logger name="Quartz.*" minlevel="Error" writeTo="default" final="true"/>
        

        基于this 的回答。这样基本保证了 Quartz 汇编错误和致命错误都写了,而其他日志不写。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-11
          • 2016-01-18
          • 2012-04-24
          • 1970-01-01
          • 2015-10-17
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多