32 Stimmen

Allgemeine Protokollierung von Funktionsparametern bei der Ausnahmebehandlung

Ein großer Teil meines C#-Codes folgt diesem Muster:

void foo(string param1, string param2, string param3)
{
    try
    {
         // do something...
    }
    catch(Exception ex)
    {
        LogError(String.Format("Error in foo(param1={0}, param2={1}, param3={2}), exception={3}", param1, param2, param3, ex.Message));
    }
}

Gibt es eine Möglichkeit, in .NET eine Key/Value-Liste der Parameter zu einer Funktion zu erhalten, so dass ich eine andere Funktion aufrufen kann, um meine Fehlerprotokollierungszeichenfolge zu konstruieren? ODER Haben Sie eine allgemeinere / bessere Möglichkeit, dies zu tun?

0 Stimmen

Vielleicht etwas mit Reflexion in der Sprache, das helfen könnte?

0 Stimmen

Sie können es über Reflexion tun, aber es wird teuer im Laufe der vielen Funktionsaufrufe.

3 Stimmen

Ich glaube nicht, dass Sie dies mit Reflection oder StackTrace/StackFrame tun können. Ich denke, Ihre einzige Wahl kann sein, ein AOP oder Post-Processing-Framework, wie PostSharp zu verwenden.

0voto

joym8 Punkte 3537

Dies ist wenig veraltet Beitrag aber nur für den Fall, jemand kommt über diese wie ich tat - Ich löste dieses Problem durch die Verwendung von PostSharp .

Es ist aber nicht praktisch kostenlos. Die Express-Lizenz (herunterladbar über NuGet in VS) erlaubt es Ihnen, Ihre Methode zu dekorieren mit [Log] Attribut und wählen Sie dann Ihren bereits konfigurierten Mechanismus für die Protokollierung, wie log4net nLog usw. Jetzt sehen Sie in Ihrem Protokoll Einträge auf der Debug-Ebene mit Angaben zu den Parametern.

Mit der Expresslizenz konnte ich nur maximal 50 Methoden in meinem Projekt dekorieren. Wenn es Ihren Bedürfnissen entspricht, sind Sie gut dran!

0voto

Aaron Gibson Punkte 1128

Ich bin spät dran, aber ich habe vor einem Jahr oder so etwas Ähnliches gemacht: Github Repo

Die Idee dieses Setups ist ähnlich wie das, was Sie suchen, aber mit der Fähigkeit, es global zu verbinden, gibt es mehr Code als ich möchte, aber es funktioniert und einmal eingesteckt, funktioniert für das, was Sie suchen.

Wenn Sie einen kurzen Blick auf die ProxyLogger.cs werfen, betrachten Sie diese als Wrapper. Sie kapselt jede Methode, die ihr gegeben wird, und führt sie aus, während sie die Protokollierung des Fehlers, wie hier festgelegt, behandelt. Dies kann dann mit Dependency Injection für alles, was Sie protokollieren möchten, eingerichtet werden, z.B.:

public void ConfigureServices(HostBuilderContext hostBuilder, IServiceCollection services)
    {
        services.AddOptions();
        services.AddSingleton<IHostedService, HostedService>();

        services.AddSingleton<IMyClass, MyClass>();

        // Logging added for both the hosted service and the example class
        services.Decorate<IMyClass, ProxyLogger<IMyClass>>();
        services.Decorate<IHostedService, ProxyLogger<IHostedService>>();
    }

Sie registrieren Ihre Dienste wie gewohnt, aber darüber hinaus können Sie sie mit dem Proxy-Logger ausstatten, um die Ausführung zu verwalten und die Details vor, nach, bei Fehlern usw. mit FULL params zu protokollieren. Ich war besessen von diesem für eine Weile und dies ist so gut wie ich es bekommen konnte, aber es funktioniert wirklich gut.

-2voto

HydPhani Punkte 552

Es gibt Szenarien mit wenigen Parametern oder einer großen Anzahl von Parametern...

  1. Wenige Parameter, ohne viel Aufhebens, besser als Teil der Protokollierung/Ausnahmemeldung schreiben.

  2. In großen Parametern würde eine mehrschichtige Anwendung ENTITIES (wie Kunde, CustomerOrder...) verwenden, um Daten zwischen den Schichten zu übertragen. Diese Entitäten sollten implementieren ToString()-Methoden der Klasse Object überschreiben, damit,

Logmessage(" method started " + paramObj.ToString()) würde die Liste der Daten im Objekt anzeigen. Irgendwelche Meinungen? :)

danke

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X