ELMAH de exibição de dados na exceção do dicionário de dados
-
11-07-2019 - |
Pergunta
Quando utilizar o ELMAH (que é brilhante) é possível visualizar informações adicionais que você tenha adicionado a uma exceção.
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);
Quando eu ver a excepção de elmah.axd não parecem mostrar que o "ExtraInfo" a chave e o valor de informação, somente a cadeia de excepção.
Solução
Não, não é possível visualizar as informações extras com as versões 1.x atuais.
Outras dicas
A minha solução foi adicionar as informações para o Servidor da coleção de Variáveis como isso.
var context = HttpContext.Current;
context.Request.ServerVariables["ERROR_CALLING_WEBSERVICE_URI"] = uri;
Elmah.ErrorLog.GetDefault(context).Log(new Error(e, context))
Sim, eu Acho que isso é um hack.
Para pequenas quantidades de dados adicionais considere a possibilidade de encapsular o erro, como sugerido por @Roma
No entanto, este método é especialmente útil quando você tem informação demais para colocar em um "encapsulado mensagem de erro'
A maneira simples de dar a volta é encapsular o erro. O erro externo conterá sua mensagem personalizada.
string msg = "my custom error message";
ErrorSignal.FromCurrentContext().Raise(
new Elmah.ApplicationException(msg,ex));
Ok, então eu tenho esperado que isso seja incluído há muito tempo e decidi fazer um garfo próprio e incluir o recurso.
Você pode encontrá-lo aqui: https://github.com/boena/elmah-with-custom-data
Elmah usa o método tostring () para obter detalhes de exceção. Basta substituir seu método de tostring () de exceção personalizado e dessa maneira funcionará:
Minha aula de exceção:
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
);
}
}
Bem, depois de ter passado o dia a trabalhar sobre isso, eu pensei que eu iria partilhar a minha solução.Muito semelhante ao Mis a solução acima, com a diferença de eu modificar o erro objeto usado por elmah em vez do servidor de solicitação de variáveis, como:
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);
}
Então, dependendo do seu aplicativo para chamar logger.LogError:
mvc adicionar um erro personalizado (filtro dehttp://maheshde.blogspot.ca/2012/09/error-handing-with-mvc-using-custom.html)
webforms substituir Application_Error global.asax
Em seguida, apenas uma etapa final global.asax, descartar quaisquer erros que já foram registrados:
public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if (e.Exception.Data.Contains("Logged"))
{
if (e.Exception.Data["Logged"].Equals(true)) e.Dismiss();
}
}
Como é de código aberto, você pode simplesmente pegar o projeto e personalizar Elmah para seus próprios propósitos:
http://code.google.com/p/elmah/
Se você estiver usando mssql
Dê uma olhada no sqlerrorlog.cs
Sqlserver.sql para gerar seu próprio banco de dados
Estou fazendo o mesmo, mas preciso adicionar uma coluna de "código de erro" gerada aleatoriamente e usarei dados de exceção para rastrear todas as informações personalizadas, de sessão, formulário e cookies que normalmente estariam no XML grande campo. Posso mudar isso para JSON, ainda não tenho certeza.