Einloggen von APIs

8

Wenn ich eine API-Assembly für eine andere Person schreibe, wäre es nützlich, eine Protokollierungsfunktion zu haben, die bei der Diagnose der Probleme der Clients hilft.

Wenn ich jedoch beispielsweise log4net in meiner Assembly referenziere, könnte dies mit der Version von log4net kollidieren, die von der Client-Anwendung verwendet wird.

Ich möchte das Rad nicht neu erfinden, indem ich mein eigenes Protokollierungs-Framework schreibe.

Was ist der beste Weg, um mein Dilemma zu lösen?

Bearbeiten: Ich nehme an, ich könnte verlangen, dass die bestimmte Version von log4net, die ich verwende, in den GAC installiert wird, um den Versionskonflikt mit dem Client zu vermeiden, aber das würde die API zu einer fetten Sache machen, die eine Installation erfordert. in der Versammlung.

    
Matt Howells 09.07.2009, 15:39
quelle

6 Antworten

4

Sehen Sie sich an, wie SpringFramework dieses Problem löst. Es verwendet Common.Logging, das dann über die Konfigurationsdatei log4net oder einem anderen benutzerdefinierten Logging-Framework zugeordnet werden kann. Sie finden weitere Details auf der Common.Logging-Website , aber Sie tun im Wesentlichen Folgendes:

  • Referenz Common.Logging in Ihrer Klasse im Einsatz ist es genau wie log4net
  • Der Consumer Ihres Frameworks wird Common.Logging so konfigurieren, dass log4net wie folgt verwendet wird:

%Vor%

Wenn der Client auch SpringFramework oder Common.Logging direkt verwendet, ist der Konflikt immer noch möglich, aber seine Chancen sind aus den folgenden Gründen stark verringert:

  • Das Common.Logging-Team ist bemüht, die Abwärtskompatibilität zukünftiger Versionen mit früheren Versionen sicherzustellen. Zum Beispiel 2.0 ist vollständig binär kompatibel mit 1.2.
  • Common.Logging ändert sich zumindest theoretisch weniger häufig als log4net
zvolkov 09.07.2009, 16:01
quelle
2

Verwenden Sie die Enterprise-Bibliothek . Es ist flexibel genug und verwendet sowohl eingebaute Logger als auch eigene Logger. Es war auch ziemlich verison-kompatibel. Es ist konfigurierbar genug, dass, wenn es einen Konflikt mit einer bestimmten Komponente gab, Sie es einfach mit Konfigurationsänderungen austauschen könnten.

    
John Saunders 09.07.2009 15:46
quelle
2

Verwenden Sie System.Diagnostics.Trace . Keine Chance der Versionskonflikte dann!

    
Matt Howells 09.07.2009 16:37
quelle
1

Dies ist der Punkt, an dem die Abhängigkeitsinjektion Ihr Freund ist - Sie müssen wahrscheinlich nicht das gesamte log4net verwenden, sondern einige kleine Teile davon. Schreiben Sie also eine ILogger-Klasse in Ihre App, die Ihre Funktionalität offen legt, und schreiben Sie dann eine Implementierung für alle Logger, die Sie verwenden möchten. Zum Beispiel ist ein Debug.Trace () - Logger ideal für Entwicklungs- oder Debugging-Arbeiten, während Sie möglicherweise einen log4net-Treiber für die Produktion benötigen. Verwenden Sie dann die Abhängigkeitsinjektion, z. B. StructureMap, um die Instanzen Ihrer Protokollfunktion in den Produktionscode einzufügen.

    
Wyatt Barnett 09.07.2009 15:58
quelle
0

Verwenden Sie Abhängigkeitsinjektion (Unity, Castle Windsor, etc.), um anzugeben, was die log4net-dll auf diese Weise verwenden soll, wenn der Client eine ältere Version verwendet, Sie können einfach dort eine Version von log4net einstecken, wenn sie nicht vorhanden ist dann stellen Sie Ihre eigenen zur Verfügung.

    
Bob The Janitor 09.07.2009 16:02
quelle
0

Wenn Sie die Protokollinformationen extern an die Personen weitergeben möchten, die sie verwenden, könnte es sich lohnen, einen Dienst wie 3scale zu verwenden (Disclaimer, Ich arbeite dort) - es lässt Sie Protokolle und Verkehrsinformationen schreiben und Entwicklern eine Schnittstelle geben, um Statistiken, Fehler, API-Schlüssel, Ratenbegrenzungen usw. zu sehen. Es sammelt auch dieses Zeug für Sie, so dass Sie es an einem Ort haben .

    
steve 23.02.2012 20:03
quelle

Tags und Links