【问题标题】:What to use for logging errors in a Quartz scheduled Job?用什么来记录 Quartz 计划作业中的错误?
【发布时间】:2011-09-09 14:48:48
【问题描述】:

我有一个 asp.net mvc 3 应用程序。在这个应用程序中,我有一个提醒系统,它使用石英从数据库中获取消息并将它们发送出去。

我想知道如果发生某些事情(比如数据库超时 - 我想知道这一点),最好的记录方式是什么。

我在我的 mvc 应用程序 ELMAH 中使用我的日志记录,它工作得很好。但是,由于quartz.net 是没有httpcontext 的自己的线程,所以我不能使用ELMAH(或者至少我认为我不能)。我尝试通过首先查询我的主页然后通过调度程序代码并将其用作上下文来创建一个 httpcontext,但这不起作用。

System.ArgumentNullException was unhandled by user code
  Message=Value cannot be null.
Parameter name: application
  Source=Elmah
  ParamName=application
  StackTrace:
       at Elmah.ErrorSignal.Get(HttpApplication application)
       at Elmah.ErrorSignal.FromContext(HttpContext context)
       at Job.Execute(JobExecutionContext context) in Job.cs:line 19
       at Quartz.Core.JobRunShell.Run()
  InnerException: 

ErrorSignal.FromCurrentContext().Raise(new System.Exception());

所以我正在寻找如何让 ELMAH 在这种情况下工作或类似的东西(发送电子邮件、堆栈跟踪和 ELMAH 所具有的一切)。

【问题讨论】:

    标签: error-handling quartz-scheduler elmah quartz.net error-logging


    【解决方案1】:

    你可以试试NLog。实施起来非常简单有效。
    您可以发送email,跟踪几乎所有内容。 我通常倾向于将所有内容保存在单独的配置文件 (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" >
        <targets>
            <target name="DebugHandler" type="File" filename="${basedir}/_Logs/${date:format=yyyyMMdd}_${level}.Log"
                layout="${longdate} ${logger}   ${aspnet-session:variable=UserName} ${threadid} ${environment}  ${identity} ${aspnet-request}   ${message}  ${exception}" />
            <target name="ErrorHandler" type="File" filename="${basedir}/_Logs/${date:format=yyyyMMdd}_${level}.Log"
                layout="${longdate} ${logger}   ${aspnet-session:variable=UserName} ${threadid} ${environment}  ${aspnet-request}   ${message}  ${exception}" />
            <target name="FatalHandler" type="File" filename="${basedir}/_Logs/${date:format=yyyyMMdd}_${level}.Log"
                layout="${longdate} ${logger}   ${aspnet-session:variable=UserName} ${threadid} ${environment}  ${aspnet-request}   ${message}  ${exception}" />
            <target name="GenericHandler" type="File" filename="${basedir}/_Logs/${date:format=yyyyMMdd}_${level}.Log"
                layout="${longdate} ${logger}   ${aspnet-session:variable=UserName} ${threadid} ${environment}  ${aspnet-request}   ${message}  ${exception}" />
        </targets>
        <rules>
            <logger name="*" level="Debug" appendTo="DebugHandler" />
            <logger name="*" level="Error" appendTo="ErrorHandler" />
            <logger name="*" level="Fatal" appendTo="FatalHandler" />
            <logger name="*" levels="Info,Warn" appendTo="GenericHandler" />
        </rules>
    </nlog>
    

    如您所见,您可以激活或停用不同的级别。

    我已经在我的quartz.net 工作以及调试/跟踪系统中使用了它,它完成了它的工作。

    唯一的限制是您没有 ELMAH 接口,有时这可能是一个巨大的限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多