ELMAH отображает данные в словаре данных исключений
-
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(), и таким образом он будет работать:
Мой класс исключений:
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, но пока не уверен.