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

StackOverflow https://stackoverflow.com/questions/1223282

  •  11-07-2019
  •  | 
  •  

Вопрос

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

Например.

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

string msg = "my custom error message";

ErrorSignal.FromCurrentContext().Raise(
               new Elmah.ApplicationException(msg,ex));

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

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

Elmah использует метод toString() для получения сведений об исключении.Просто переопределите свой пользовательский метод exception 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
            );
    }
}

Что ж, потратив целый день на работу над этим, я решил поделиться своим решением.Очень похоже на решение Myster выше, разница в том, что я изменяю объект error, используемый 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.Ошибка входа:

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();
    }
}

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top