ELMAH отображать данные в словаре данных исключений - PullRequest
11 голосов
/ 03 августа 2009

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

* 1003 Е.Г. *

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, а только строка исключения.

Ответы [ 7 ]

20 голосов
/ 23 февраля 2012

Моим решением было добавить информацию в коллекцию Server Variables следующим образом.

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

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

7 голосов
/ 25 февраля 2010

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

string msg = "my custom error message";

ErrorSignal.FromCurrentContext().Raise(
               new Elmah.ApplicationException(msg,ex));
2 голосов
/ 19 ноября 2014

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

sample exception in 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
            );
    }
}
2 голосов
/ 23 ноября 2012

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

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

2 голосов
/ 04 августа 2009

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

1 голос
/ 26 марта 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();
    }
}
0 голосов
/ 09 мая 2012

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

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

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

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

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

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

...