.net - 在控制台应用程序中使用 ELMAH

标签 .net desktop-application console-application elmah

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

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

最佳答案

除了我们的 ASP.NET 站点之外,我们还需要能够从控制台应用程序和 Windows 服务进行登录。我使用了答案( ErrorLog.GetDefault(null); ),效果很好,直到我也需要发送电子邮件。

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

要在代码中进行过滤,请 Hook 相应的 .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);
                }
            }
    }
}

此外,您还需要添加对 System.Web.dll 的引用在您的项目中才能使其发挥作用。

编辑:根据评论,仅当您的配置文件具有 <errorMail async="false"/> 时,此代码才会发送电子邮件。引用this code snippet你是否想保留 <errorMail async="true"/>在您的配置文件中(当 HttpContext.Current 可用时使用)。

关于.net - 在控制台应用程序中使用 ELMAH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/841451/

相关文章:

c# - 我可以在没有过多引用的情况下使用控制台应用程序截屏或打印屏幕吗

c# - 在 C# 控制台应用程序中访问数据库

.net - 存储库与域服务

.net - 始终在 DAL 基类中使用 TransactionScope 是一个好习惯吗?

.net - 是否有下划线(_)行继续的相反?

electron - Electron 是企业应用程序的可靠框架吗?

logging - 来自 appsettings.json 中 Filters.Expressions 的 Serilog 和过滤器

c# - 使用 C# 运行 shell 命令并将信息获取到字符串中

c# - Windows 10 桌面应用程序中的彩色磁贴

windows - 使用批处理文件设置壁纸目录