Datos de visualización de ELMAH en el diccionario de datos de excepción

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

  •  11-07-2019
  •  | 
  •  

Pregunta

Al usar ELMAH (que es brillante) es posible ver información adicional que ha agregado a una excepción.

Por ejemplo

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

Cuando veo la excepción de elmah.axd no parece mostrar la información de clave y valor "ExtraInfo", solo la cadena de excepción.

¿Fue útil?

Solución

No, no es posible ver la información adicional con las versiones 1.x actuales.

Otros consejos

Mi solución fue agregar la información a la colección de variables del servidor de esta manera.

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

Sí, creo que esto es un truco.
Para pequeñas cantidades de datos adicionales, considere encapsular el error como sugiere @Roma
Sin embargo, este método es especialmente útil cuando tiene demasiada información para poner en un 'mensaje de error encapsulado'

La forma simple de dar la vuelta es encapsular el error. El error externo contendrá su mensaje personalizado.

string msg = "my custom error message";

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

Ok, entonces he estado esperando que esto se incluya durante demasiado tiempo y decidí hacer un tenedor propio e incluir la función yo mismo.

Puede encontrarlo aquí: https://github.com/boena/elmah- con datos personalizados

Elmah usa el método ToString () para obtener detalles de excepción. Simplemente anule su método personalizado ToString () y de esta manera funcionará:

excepción de muestra en elmah

Mi clase de excepción:

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

Bueno, después de pasar el día trabajando en esto, pensé en compartir mi solución. Muy similar a la solución anterior de Myster, la diferencia es que modifico el objeto de error utilizado por elmah en lugar de las variables del servidor de solicitudes, de esta manera:

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

Luego, dependiendo de su aplicación para llamar al registrador. LogError:

mvc agrega un filtro de error personalizado ( http : //maheshde.blogspot.ca/2012/09/error-handing-with-mvc-using-custom.html )

los formularios web anulan Application_Error en global.asax

Luego, solo un paso final en global.asax, descarte cualquier error que ya haya sido registrado:

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

Dado que es de código abierto, puede tomar el proyecto y personalizar Elmah para sus propios fines:

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

Si está utilizando MSSQL

  • eche un vistazo a SqlErrorLog.cs

  • SQLServer.sql para generar su propia base de datos

Estoy haciendo lo mismo, pero necesito agregar un código de error adicional generado aleatoriamente columna y usaré datos de excepción para rastrear toda la información personalizada, de sesión, de formulario y de cookie que normalmente estaría en el campo xer súper grande. Puedo cambiar esto a JSON, aún no estoy seguro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top