在Quartz .Net中关闭调试日志记录。

24

我在我们的应用程序中使用Quartz.NET来安排一些自定义任务。一切都正常,除了它每秒记录大约二十个调试条目。

我不知道如何关闭调试日志记录。如果有帮助,将不胜感激,因为我已经在网络上尝试查找了很久。

调试条目看起来像下面这样

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
6个回答

27

如果你想减少通过公共日志基础设施记录的所有日志,那么Rytmis' answer非常好。

但是如果你有更多的代码通过公共日志进行记录,而你只想减少Quartz产生的日志量(而不是来自其余代码的日志),我建议你按照以下步骤操作:

在log4net配置XML文件(通常是app.config)中,你可能已经有类似于下面这样的代码:

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

保留原样不要做改动。在此之后(或者在 <log4net> 配置部分的任何位置)添加以下内容:

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

这个<logger>部分会将所有名称空间为“Quartz”的记录器进行配置。在这个例子中,Quartz将使用ERROR级别进行日志记录,而我的应用程序的其余部分将使用ALL级别进行日志记录。


2
实际上问题并不是如何提高您的一般日志级别,因此,这应该被标记为答案,因为它解决了问题。 - Kjellski
如何以编程方式实现此操作? - Dim_Ka

17
如果有人需要在NLog中进行此操作,只需将以下内容作为NLog.Config中的最顶部规则添加即可。
<!-- Disable Quartz info logging -->
<logger name="Quartz*" minlevel="Trace" maxlevel="Info" final="true" />
注意,如果您不想改变内容,仍然可以让“Warn”,“Error”和“Fatal”到其他记录器,请将maxlevel="Info"更改为maxlevel="Fatal"

嘿,我尝试了你的建议,但它禁用了所有其他规则,你能更详细地解释如何正确使用吗? - Valentyn Vynogradskiy
你应该将它放在所有其他日志记录器的上面,同时确保你的类没有在命名空间中或者类名以Quartz开头,因为这会禁用它们。它的作用是告诉NLog忽略所有名称以Quartz开头的记录器。 - Peter
也许我会发布问题。 - Valentyn Vynogradskiy
请参阅此处的详细信息https://dev59.com/Ibzqs4cB2Jgan1znxsb6 - Valentyn Vynogradskiy

7
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:**

为了那些不想阅读评论的人,日志级别实际上是在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中的条目如下所示。 你能告诉我在哪里添加你建议的条目吗?<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"/> </factoryAdapter> </logging> </common> - Ganesh
我使用了你的配置并添加了相关行,已经编辑了我的答案。 - Rytmis
我们还从Quartz .net调用的组件中记录信息作为定时作业。在键中指定多个值是否可行?<arg key="level" value="ERROR" /> <!-- 在此处添加这一行 -->这样做是否可行? <arg key="level" value="ERROR, INFO, WARN" />感谢您的所有帮助。 - Ganesh
1
Log4Net文档中提到:“在级别为K的记录器中,级别为L的日志请求(无论是分配的还是继承的)将启用,如果L >= K。这个规则是log4net的核心。它假定级别是有序的。对于标准级别,我们有DEBUG < INFO < WARN < ERROR < FATAL。”我的理解是,如果您将日志级别设置为INFO,则还将获取来自WARN、ERROR和FATAL级别的所有消息。因此,在我的示例中,您应该将ERROR替换为INFO。 - Rytmis
根标签configuration是 <level value="All"/>,我将其更改为<level value="INFO"/>。Quartz.Net已停止Debug日志记录,但仍会记录每秒至少5个Info条目。是否有一种方式可以通过jobs.xml文件控制Quartz .Net的触发器和计划的日志记录? - Ganesh
显示剩余3条评论

6
在我个人的情况下,如果想要关闭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;

2

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

<?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>

1
如果你只想删除多余的信息和调试日志,我会添加:
<logger name="Quartz.*" minlevel="Error" writeTo="default" final="true"/>

根据this的回答。这基本上确保了Quartz程序集错误和致命错误被记录,但其他日志不会。


这看起来像是我想要的,但实际上它什么都没做。完整的日志记录仍在继续,我不确定为什么这个设置没有被遵守。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接