Используя ELMAH в консольном приложении

Идти как

        getRepositoryManager().loadAllPcbDetails()
            .flatMapIterable {
                    listPcbDetail-> listPcbDetail
                // listPcbDetail is ArrayList<PcbDetails>
                // Converts your list of ids into an Observable
                // which emits every item in the list           
            }
            .flatMap { pcbDetail ->
                // pcbDetail is PcbDetails
                getRepositoryManager().loadAllPcbs(pcbDetail.pcbIdList)
            }.subscribe { listPcb ->
                // listPcb is ArrayList<Pcb>
            }

65
задан Tim S. Van Haren 14 January 2010 в 21:29
поделиться

4 ответа

Здесь точно такая же ситуация. Запуск ELMAH для всех наших веб-приложений. Некоторые из них имеют планировщики на основе консоли.

После некоторого покопания в исходном коде, следующий код, похоже, работает:

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

Единственная реальная проблема с вышеизложенным заключается в том, что вам нужно сохранить имя приложения где-нибудь в вашей конфигурации, чтобы иметь возможность видеть записи в программе просмотра 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));
        }
68
ответ дан 24 November 2019 в 15:17
поделиться

Редактировать : Это МОЖЕТ быть сделано - См. этот ответ.


Я почти уверен, что вы не можете этого сделать , Я постараюсь выкопать соответствующий материал.

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

Итак, из чего я можно найти поиск в группе Google, что это невозможно ... Поскольку ELMAH работает с HttpHandlers (конструкция asp.net), это только ASP.NET.

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

ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());

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

Если вам это нужно, это ссылка на репозиторий кода ELMAH .

5
ответ дан 24 November 2019 в 15:17
поделиться

ELMAH означает модули регистрации ошибок и обработчики - конечно, имея в виду IHttpModule и IHttpHandler .

Консольные приложения не используют HTTP , поэтому, как правило, не сможет получить большую пользу от модулей и обработчиков, созданных для HTTP.

-6
ответ дан 24 November 2019 в 15:17
поделиться

В дополнение к нашему сайту 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);
                }
            }
    }
}

Кроме того, вам нужно будет добавить ссылку в System.Web.dll в вашем проекте, чтобы это работало.

ИЗМЕНИТЬ : Согласно комментариям, этот код будет отправлять электронные письма только в том случае, если в вашем конфигурационном файле есть . Обратитесь к этому фрагменту кода , если вы хотите сохранить в вашем файле конфигурации (для использования, когда доступен HttpContext.Current).

77
ответ дан 24 November 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: