ELMAH отображает данные в словаре данных исключений

При использовании ELMAH (что блестяще) можно просмотреть дополнительную информацию, которую вы добавили к исключению.

E.g.

Exception ex = new Exception("New exception to use ErrorSignal functionality");
ex.Data.Add("ExtraInfo", "Here is some extra information i would like to be displayed.");
ErrorSignal.FromCurrentContext().Raise(ex);    

Когда я просматриваю исключение из elmah.axd, кажется, что он не показывает информацию о ключе и значении «ExtraInfo», а только строку исключения.


person Rob    schedule 03.08.2009    source источник


Ответы (7)


Нет, в текущих версиях 1.x невозможно просмотреть дополнительную информацию.

person Atif Aziz    schedule 04.08.2009
comment
Атиф, очень рекомендую добавить эту функцию! - person Chris Marisic; 13.09.2010
comment
Согласен, и это уже зарегистрированная проблема [1]. Вы можете пометить выпуск, чтобы следить за его обновлениями. [1] code.google.com/p/elmah/issues/detail ?id=162 - person Atif Aziz; 22.09.2010
comment
Я думаю, что на этой странице уже есть патч для него, но, к сожалению, он еще не попал в официальный релиз. - person NickG; 10.08.2012
comment
Он уже есть в официальном релизе? - person ; 18.03.2016
comment
реестр задач переместился на github, поэтому теперь вы можете перейти сюда: github.com/elmah/Elmah/ вопросы/162 - person Myster; 10.04.2017

Мое решение состояло в том, чтобы добавить информацию в коллекцию переменных сервера следующим образом.

var context = HttpContext.Current;
context.Request.ServerVariables["ERROR_CALLING_WEBSERVICE_URI"] = uri;
Elmah.ErrorLog.GetDefault(context).Log(new Error(e, context))

Да, я думаю, что это взлом.
Для небольших объемов дополнительных данных рассмотрите возможность инкапсуляции ошибки, как предложил @Roma
Однако этот метод особенно полезен, когда у вас слишком много информации, чтобы поместить ее в «инкапсулированное сообщение об ошибке». '

person Myster    schedule 23.02.2012
comment
Этот метод работает до того, как вы вызовете ошибку, но вы также можете сделать это через global.asax для всех ошибок в void ErrorLog_Filtering(object sender, Elmah.ExceptionFilterEventArgs e) (до создания объекта Error) и привести e.Context as HttpContext - person Dave Transom; 16.10.2012
comment
Очень хороший ответ, но он работает только внутри веб-приложения, а не в домене приложения, поскольку вам нужен доступ к HTTP-контексту. - person Gabriel; 24.02.2013

Простой способ обойти это - инкапсулировать ошибку. Внешняя ошибка будет содержать ваше пользовательское сообщение.

string msg = "my custom error message";

ErrorSignal.FromCurrentContext().Raise(
               new Elmah.ApplicationException(msg,ex));
person Roma    schedule 25.02.2010

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

Вы можете найти его здесь: https://github.com/boena/elmah-with-custom-data

person boena    schedule 23.11.2012
comment
У вас есть код для него? Ссылка, которую вы дали выше, не работает. - person Ajit Goel; 18.02.2013
comment
О, снэп, извини. Я переименовал его с тех пор, как я вижу сейчас. Надеюсь, вы нашли его, просматривая мои репозитории, в противном случае вы можете найти его по ссылке, и если вы также не хотите, чтобы приложение Log Analyzer Desktop отображало пользовательские данные, это здесь ссылка - person boena; 06.04.2013
comment
я поправил неработающую ссылку - person Fatal; 05.01.2014
comment
@boena, ссылка снова не работает. - person Alex; 12.06.2017

Elmah использует метод ToString() для получения сведений об исключении. Просто переопределите свой собственный метод исключения ToString(), и он будет работать следующим образом:

пример исключения в elmah

Мой класс исключений:

public class MyCustomException : Exception
{
    public string CustomProperty { get; set; }

    public MyCustomException(string message, string customProperty): base(message)
    {
        this.CustomProperty = customProperty;
    }

    public override string ToString()
    {
        var result = base.ToString();
        var propertyData = String.Format("CustomProperty: {0}", this.CustomProperty);

        return result.Insert(
            result.IndexOf(Environment.NewLine),
            Environment.NewLine + propertyData
            );
    }
}
person frizik    schedule 19.11.2014

Что ж, поработав над этим целый день, я решил поделиться своим решением. Очень похоже на решение Myster выше, разница в том, что я изменяю объект ошибки, используемый elmah, вместо переменных сервера запросов, например:

    public static void LogError(Exception e, IDictionary<string, string> customFields = null)
    {
        var logger = ErrorLog.GetDefault(HttpContext.Current);

        customFields = customFields ?? new Dictionary<string, string>();

        // Used to tell elmah not to log this twice (See global.asax)
        e.Data.Add("Logged", true);

        var error = new Error(e, HttpContext.Current);

        customFields.ForEach(pair => error.ServerVariables.Add(pair.Key, pair.Value));

        logger.Log(error);
    }

Затем, в зависимости от вашего приложения, для вызова logger.LogError:

mvc добавить собственный фильтр ошибок (http://maheshde.blogspot.ca/2012/09/error-handing-with-mvc-using-custom.html)

веб-формы переопределяют Application_Error в global.asax

Затем, только один последний шаг в global.asax, отклоните все ошибки, которые уже были зарегистрированы:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (e.Exception.Data.Contains("Logged"))
    {
        if (e.Exception.Data["Logged"].Equals(true)) e.Dismiss();
    }
}
person Mitchell Lee    schedule 25.03.2014

Поскольку это открытый исходный код, вы можете просто взять проект и настроить Elmah для своих целей:

http://code.google.com/p/elmah/

Если вы используете MSSQL

  • взгляните на SqlErrorLog.cs

  • SQLServer.sql для создания собственной базы данных

Я делаю то же самое, но мне нужно добавить дополнительный случайно сгенерированный столбец «код ошибки», и я буду использовать данные исключений для отслеживания всей пользовательской информации, сеанса, формы, информации о файлах cookie, которая обычно была бы в uber large xml поле. Я могу изменить это на JSON, пока не уверен.

person sonjz    schedule 09.05.2012