在控制台应用程序中使用ELMAH

Mic*_*oie 65 .net elmah desktop-application console-application

我刚开始使用ELMAH并且是粉丝.我的团队支持大量的Web应用程序,我特别兴奋的是ELMAH允许我们将每个应用程序的异常保存到同一个MS SQL数据库表中.

我们还支持一些控制台,DLL和桌面应用程序.是否可以使用ELMAH DLL将这些应用程序中的异常记录到同一位置?

Bri*_*nce 77

除了ASP.NET站点之外,我们还需要能够从控制台应用程序和Windows服务进行日志记录.我使用了答案(ErrorLog.GetDefault(null);),它运作良好,直到我需要发送电子邮件.

所以,这是我的解决方案.它处理日志,电子邮件,推文和过滤(在配置文件和代码中).我还将主调用包装为Exception的扩展,因此可以调用它:catch(Exception ex) { ex.LogToElmah(); }

要在代码中过滤,请挂钩相应的.Filtering事件: ElmahExtension.ErrorLog.Filtering += new ExceptionFilterEventHandler(ErrorLog_Filtering);

码:

using System;
using System.Web;
using Elmah;
namespace System
{
    public static class ElmahExtension
    {
        public static void LogToElmah(this Exception ex)
        {
            if (HttpContext.Current != null)
            {
                ErrorSignal.FromCurrentContext().Raise(ex);
            }
            else
            {
                if (httpApplication == null) InitNoContext();
                ErrorSignal.Get(httpApplication).Raise(ex);
            }
        }

            private static HttpApplication httpApplication = null;
            private static ErrorFilterConsole errorFilter = new ErrorFilterConsole();

            public static ErrorMailModule ErrorEmail = new ErrorMailModule();
            public static ErrorLogModule ErrorLog = new ErrorLogModule();
            public static ErrorTweetModule ErrorTweet = new ErrorTweetModule();

            private static void InitNoContext()
            {
                httpApplication = new HttpApplication();
                errorFilter.Init(httpApplication);

                (ErrorEmail as IHttpModule).Init(httpApplication);
                errorFilter.HookFiltering(ErrorEmail);

                (ErrorLog as IHttpModule).Init(httpApplication);
                errorFilter.HookFiltering(ErrorLog);                

                (ErrorTweet as IHttpModule).Init(httpApplication);
                errorFilter.HookFiltering(ErrorTweet);
            }

            private class ErrorFilterConsole : ErrorFilterModule
            {
                public void HookFiltering(IExceptionFiltering module)
                {
                    module.Filtering += new ExceptionFilterEventHandler(base.OnErrorModuleFiltering);
                }
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您需要System.Web.dll在项目中添加对该工具的引用.

编辑:根据评论,此代码将仅在您的配置文件具有时发送电子邮件<errorMail async="false"/>.如果要保留在配置文件中(在HttpContext.Current可用时使用),请参阅此代码段<errorMail async="true"/>.

  • 在我设置<elmah> <errorMail async ="false"/> </ elmah>之前,这在单元测试中对我不起作用.我之前设置为async async. (6认同)
  • 使用此扩展程序.将configsection和elmah配置添加到app.config,设置<errorMail async ="false"/>,使它对我有用. (3认同)
  • 我复制了你的代码,在我的例外情况下我这样做ex.LogToElmah(); 它通过代码但是当我查看elmah.axd时,没有任何记录.在本地主机上我不使用电子邮件发送或任何东西,所以我不确定这是不是原因.没有什么事情可以崩溃.我是否需要勾选其他内容? (2认同)

Duk*_*ets 68

我们在这里有完全相同的情况.为我们所有的Web应用程序运行ELMAH.其中一些有基于控制台的调度程序.

在对源代码进行一些挖掘之后,以下代码似乎可以工作:

            ErrorLog errorLog = ErrorLog.GetDefault(null);
            errorLog.ApplicationName = "/LM/W3SVC/1/ROOT/AppName";
            errorLog.Log(new Error(ex));
Run Code Online (Sandbox Code Playgroud)

上面唯一真正的问题是你需要在配置中的某个位置保留应用程序名称才能看到ELMAH.axd查看器上的条目.

所以在我们的通用错误处理代码中我们做:

        if (HttpContext.Current != null)
            ErrorSignal.FromCurrentContext().Raise(ex);
        else
        {
            ErrorLog errorLog = ErrorLog.GetDefault(null);
            errorLog.ApplicationName = ErrorHandling.Application;
            errorLog.Log(new Error(ex));
        }
Run Code Online (Sandbox Code Playgroud)

  • 不太可能,errorLog.Log似乎绕过所有其他侦听器.谁知道更好? (3认同)
  • 嗯 - 非常酷,但我似乎无法在控制台应用程序中发生错误时发送电子邮件.有任何想法吗? (2认同)

Jef*_*eff 14

如果您只想通过电子邮件发送没有http的日志,您可以这样做:

    public class MyElmahMail: ErrorMailModule
    {
        public MyElmahMail()
        {
//this basically just gets config from errorMail  (app.config)
            base.OnInit(new HttpApplication());
        }
        public void Log(Error error)
        {
//just send the email pls
            base.ReportError(error);
        }
    }

//to call it
var mail = new MyElmahMail();
mail.Log(new Error(new NullReferenceException()));//whatever exception u want to log
Run Code Online (Sandbox Code Playgroud)

就app.config而言

//Under configSections
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    </sectionGroup>
Run Code Online (Sandbox Code Playgroud)

  <elmah>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="C:\Elmah.Error" applicationName="MyAwesomeApp" />
    <errorMail from="from@email.com" to="to@email.com" />
  </elmah>
Run Code Online (Sandbox Code Playgroud)

和你选择的smtp设置.

全部完成.:-)

  • 放下答案!在尝试了所有的东西后,这首先尝试了! (3认同)

Gav*_*ler 5

编辑:这CAN来实现-见这个答案.


我很确定你不能这样做.我会尝试挖掘相关材料.

http://groups.google.com/group/elmah/browse_thread/thread/f214c4f782dc2bf4/d96fe43b60765f0c?lnk=gst&q=app#d96fe43b60765f0c

所以从我可以找到的搜索谷歌组是不可能的......因为ELMAH使用HttpHandlers(一个asp.net构造),它只是ASP.NET.

话虽如此,有一些方法可以在控制台应用程序上使用它.ELMAH提供了一种引发错误的方法,因此您可以在异常处理中包装ELMAH,然后通过以下方式发出错误信号:

ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());
Run Code Online (Sandbox Code Playgroud)

这意味着将整个应用程序包装在异常处理程序和信令中.它可能需要你一些调整来降低它,但我认为这是完全可能的.

如果您需要它,这是ELMAH代码存储库的链接.