elmah: исключения без HttpContext? - PullRequest
42 голосов
/ 21 января 2010

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

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

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

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

Ответы [ 4 ]

73 голосов
/ 04 февраля 2010

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

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

, а затем

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

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

2 голосов
/ 08 мая 2012

Я не использовал <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/

1 голос
/ 17 сентября 2014

Для моего приложения я сохранил 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);

    }
}
0 голосов
/ 22 марта 2010

Я добавил решение для: Использование ELMAH в консольном приложении , которое добавляет возможность отправки электронной почты, твитов и фильтров в дополнение к регистрации.

...