2010-01-21 6 views
42

Я создаю поток на Application_Start и хотел бы регистрировать исключения. Нет Context/HttpContext/HttpContext.Current, так как я могу получить его для регистрации?elmah: исключения без HttpContext?

На данный момент это не вызывает каких-либо исключений в моих потоках, и если я пишу ErrorSignal.FromCurrentContext().Raise(ex);, то я получаю сообщение об ошибке не может быть null.

Возможно, я могу создать фиктивный HttpContext, но почему-то я не думаю, что это будет хорошо работать.

-edit- Я пробовал ErrorSignal.Get(new HttpApplication()).Raise(ex);, и, похоже, это не исключение.

ответ

71

Убедитесь, что вы установите имя приложения в web.config

<errorLog type="Elmah.SqlErrorLog, Elmah" 
      connectionStringName="nibWeb" 
      applicationName="Nib.Services" /> 

, а затем

ErrorLog.GetDefault(null).Log(new Error(error)); 

будет работать

+0

Спасибо! Я это очень оценил! – 2010-02-04 00:59:20

+0

Как установить имя приложения в файле web.config? – chobo2

+1

@ chobo2 - Я отредактировал ответ Брендана, чтобы вы могли увидеть его пример web.config – amurra

0

Я добавил решение: Using ELMAH in a console application, добавляющий возможность отправлять электронную почту , твиты и фильтр в дополнение к протоколированию.

2

Я не использовал <errorLog>, как в ответе Брендана Кэри, потому что я был только в журнале регистрации. Тем не менее, его команда работала великолепно в моем случае, не называя приложения:

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The application has done something."))); 

Я СДЕЛАЛ перекомпилировать Elmah с .NET 4.0, из-за ошибки о необходимости System.Web.Abstractions 3.5.0.0. Моя compiled-for-.NET 4,0 вилка здесь, если кто-то хочет его (также сильное именование):

http://code.google.com/r/scottstafford-elmah/

+0

ПРИМЕЧАНИЕ. Как только я переключился на использование SQL-журнала, мне понадобилось ApplicationName. –

1

Для моего приложения, я спас this.Context.ApplicationInstance в Application_Start, так что я могу назвать Elmah.ErrorSignal.Get с сохраненным экземпляром. С ErrorSignal я мог бы затем Raise. Это проходит через все фильтры электронной почты.

Ниже приведен код. Я использую FluentScheduler до

public class Global : HttpApplication { 
    void Application_Start(object sender, EventArgs e) { 

     var application = Context.ApplicationInstance; 
     FluentScheduler.TaskManager.UnobservedTaskException += 
      (FluentScheduler.Model.TaskExceptionInformation i, UnhandledExceptionEventArgs a) => 
       Elmah.ErrorSignal.Get(application).Raise(i.Task.Exception); 

    } 
} 
Смежные вопросы