Domanda

E 'possibile registrare le proprietà di eccezione con NLog?

Per esempio SocketException ha proprietà quali CodiceErrore, HResult, NativeErrorCode, ecc che sono specifici per solo questo tipo di eccezioni. E 'possibile per loro accedere senza esplicitamente la registrazione (cioè senza usare Log(e.ErrorCode)) loro e utilizzando solo ErrorException dal codice? L'impostazione predefinita Eccezione disposizione renderer chiama semplicemente ToString sull'eccezione.

È stato utile?

Soluzione

Non so se è una buona idea, ma è possibile scrivere il proprio LayoutRenderer. Per mantenere le cose semplici che ho appena scritto uno che eredita da ExceptionLayoutRenderer e overrode il metodo Append.

[LayoutRenderer("ExtendedException")]
    public class ExtendedExceptionLayoutRenderer : ExceptionLayoutRenderer
    {
        protected override void Append(System.Text.StringBuilder builder, LogEventInfo logEvent)
        {
            base.Append(builder, logEvent);

            var exception = logEvent.Exception;
            if (exception is SocketException)
            {
                var sockException = (SocketException) exception;
                builder.Append(sockException.ErrorCode).Append(" ").Append(sockException.SocketErrorCode);
            }
        }
    }

La gestione del SocketException non è molto sofisticato. Sono sicuro che ci sia un modo migliore, ma dimostra come si può fare.

Per attivare che si deve regolare la configurazione in questo modo:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <extensions>
        <add assemblyFile="YourAssembly.dll"/>
    </extensions>

    <targets>
        <target name="console" xsi:type="Console" layout="${extendedexception} ${message}"/>
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="console" />
    </rules>
</nlog>

Modifica

Ok, non era consapevole che si desidera che la funzione per ogni eccezione che ha il proprio proprietà. Se ci sono solo un paio di voi altri siete a interessati, si può solo aggiungere di più se (eccezione è YourExceptionType) e regolare quali proprietà che ti interessa. Un approccio più generico è quello di utilizzare la riflessione per registrare tutte le proprietà che sono definite sulla eccezione.

[LayoutRenderer("ExtendedException")]
    public class ExtendedExceptionLayoutRenderer : ExceptionLayoutRenderer
    {
        protected override void Append(System.Text.StringBuilder builder, LogEventInfo logEvent)
        {
            var exception = logEvent.Exception;
            var type = exception.GetType();
            var properties = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);

            var logEntries = new SortedDictionary<string, string>();

            foreach (var property in properties)
            {
                var name = property.Name;
                var value = property.GetValue(exception, null).ToString();
                logEntries.Add(name, value);
            }

            foreach (var entry in logEntries)
            {
                builder.AppendFormat("{0}: {1} ", entry.Key, entry.Value);
            }

            base.Append(builder, logEvent);
        }
    }

Questo aggiunge ogni proprietà che è dichiarato sul tipo di eccezione in ordine alfabetico per l'output del registro.

Altri suggerimenti

Non ho familiarità con NLog, ma è possibile intercettare l'eccezione in un blocco try / catch e poi gettare una nuova eccezione del proprio tipo, ignorando ToString per l'output dei dati che ti interessano nel vostro nuovo tipo di eccezione ?

Questo spezzerebbe tracciando un po ', quindi si sarebbe probabilmente necessario includere le informazioni di traccia dal eccezione originale nell'output ToString, ma potrebbe essere un lavoro abbastanza facile intorno.

L'altro mio pensiero è stato quello di estendere e di override ToString di SocketException, ma non credo che sia possibile in C #.

Serialize l'eccezione e registrare il flusso risultante?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top