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"/>.
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)
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设置.
全部完成.:-)
编辑:这CAN来实现-见这个答案.
我很确定你不能这样做.我会尝试挖掘相关材料.
所以从我可以找到的搜索谷歌组是不可能的......因为ELMAH使用HttpHandlers(一个asp.net构造),它只是ASP.NET.
话虽如此,有一些方法可以在控制台应用程序上使用它.ELMAH提供了一种引发错误的方法,因此您可以在异常处理中包装ELMAH,然后通过以下方式发出错误信号:
ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());
Run Code Online (Sandbox Code Playgroud)
这意味着将整个应用程序包装在异常处理程序和信令中.它可能需要你一些调整来降低它,但我认为这是完全可能的.
如果您需要它,这是ELMAH代码存储库的链接.
| 归档时间: |
|
| 查看次数: |
25230 次 |
| 最近记录: |