2012-05-20 8 views
7

Ich arbeite derzeit an Version 1.0.0 pyftpdlib Modul. Diese neue Version wird einige rückwärts inkompatible Änderungen in einführen, dass bestimmte APIs keine Bytes mehr akzeptieren, sondern Unicode. Während ich dabei bin, als Teil dieser Reise, erwog ich die Möglichkeit, meine Protokollfunktionen loszuwerden, die derzeit die Druckanweisung verwenden, und stattdessen das Protokollierungsmodul verwenden.Vorteile der Protokollierung vs. print() + Protokollierung bewährter Methoden

Ab rechten pyftpdlib jetzt Delegierten, die Protokollierung zu 3 Funktionen:

def log(s): 
    """Log messages intended for the end user.""" 
    print s 

def logline(s): 
    """Log commands and responses passing through the command channel.""" 
    print s 

def logerror(s): 
    """Log traceback outputs occurring in case of errors.""" 
    print >> sys.stderr, s 

Der Benutzer bereit Protokolle anpassen (zB schreibt sie in eine Datei) soll nur diese drei Funktionen überschreiben, wie in:

Jetzt frage ich mich: Welche Vorteile würden bedeuten, diesen Ansatz loszuwerden und stattdessen Logging-Modul verwenden? Aus einer Modul-Anbieter-Perspektive, wie genau soll ich Logging-Funktionen in meinem Modul verfügbar machen? Sollte ich dies tun:

import logging 
logger = logging.getLogger("pyftpdlib") 

... und Staat in meinem doc, dass „Logger“ ist das Objekt, das sollte für den Benutzer verwendet werden, falls will anpassen, wie Protokolle verhalten? Ist es legitim, einen vordefinierten Format ausgegeben bewusst auf wie in:

FORMAT = '[%(asctime)] %(message)s' 
logging.basicConfig(format=FORMAT) 
logger = logging.getLogger('pyftpdlib') 

...?

Können Sie an ein Modul eines Drittanbieters denken? Ich kann Hinweise darauf verwenden, wo die Protokollierungsfunktionalität als Teil der öffentlichen API verfügbar gemacht und konsolidiert wird?

Vielen Dank im Voraus.

Antwort

0

Hier ist eine Ressource, die ich verwendet habe, um eine anpassbare logger. Ich habe mich nicht viel geändert, ich habe nur eine if-Anweisung hinzugefügt und gebe an, ob ich mich in eine Datei oder nur in die Konsole einloggen möchte.

Überprüfen this Colorer aus. Es ist wirklich nett, die Ausgabe so zu kolorieren, dass DEBUG anders aussieht als WARN, was anders aussieht als INFO.

Das Logging-Modul bündelt eine Menge nette Funktionen, wie SMTP-Protokollierung, Dateirotationsprotokollierung (Sie können also ein paar alte Protokolldateien speichern, aber nicht jedes Mal, wenn etwas schief geht, 100s davon erstellen).

Wenn Sie jemals nach Python 3 migrieren möchten, müssen Sie mit dem Protokollierungsmodul Ihre Druckanweisungen ändern.

Logging ist großartig, je nachdem, was Sie tun, ich habe es nur leicht verwendet, um zu sehen, wo ich in einem Programm bin (wenn Sie diese Funktion ausführen, auf diese Weise Farbe), aber es hat deutlich mehr Macht als eine normale Druckanweisung.

0

Sie können sich Django ansehen (erstellen Sie einfach ein Beispielprojekt) und sehen, wie es das Loggersubsystem initialisiert.

Es gibt auch eine contextual logger helper, die ich vor einiger Zeit geschrieben habe - dieser Logger nimmt automatisch den Namen des Moduls/der Klasse/Funktion an, von dem er initialisiert wurde.Dies ist sehr nützlich für Debug-Nachrichten, wo Sie rechts durch dieses Modul sehen können, spuckt die Nachrichten und wie der Anruf fließt.

3

Bibliotheken (FTP-Server oder Client-Bibliothek) sollte das Protokollierungssystem nie initialisieren. Es ist also in Ordnung, ein Logger-Objekt zu instanziieren und auf logging.basicConfig in der Dokumentation zu zeigen (oder eine Funktion in der Art von basicConfig mit dem schickeren Ausgang bereitzustellen und den Benutzer zwischen seiner Protokollierungskonfigurationsstrategie plain basicConfig oder der Bibliothek auszuwählen vorgesehen Konfiguration)

Frameworks (zB django) oder Server (fTP-Server-Daemon) sollte das Logging-System auf einen vernünftigen Standard initialisieren und für die Anpassung von Logging-Systemkonfiguration ermöglichen.

2

In der Regel sollten Bibliotheken nur einen NullHandler-Handler erstellen, der einfach ein do nothing-Handler ist. Der Endbenutzer oder Anwendungsentwickler, der Ihre Bibliothek verwendet, kann dann das Protokollierungssystem konfigurieren. Weitere Informationen finden Sie im Abschnitt Configuring Logging for a Library in der Dokumentation logging. Beachten Sie insbesondere den Hinweis

Es wird dringend empfohlen, dass Sie keine anderen Handler als NullHandler zu den Loggern Ihrer Bibliothek hinzufügen.

In Ihrem Fall würde ich einfach einen Protokollhandler erstellen, gemäß der Logging-Dokumentation,

import logging 
logging.getLogger('pyftpdlib').addHandler(logging.NullHandler()) 

bearbeiten Die Logging-Implementierung in der Frage skizzierte scheint durchaus sinnvoll. Erwähnen Sie in Ihrer Dokumentation einfach logger und diskutieren oder verweisen Sie Benutzer auf die Methoden logging.setLevel und logging.setFormatter, um die Ausgabe Ihrer Bibliothek anzupassen. Anstatt logging.basicConfig(format=FORMAT) zu verwenden, können Sie die Einstellungen für Ihre Ausgabe mithilfe von logging.config.fileConfig verwalten und die Konfigurationsdatei irgendwo in Ihrer Dokumentation dokumentieren, um den Benutzer erneut auf die Dokumentation des Protokollmoduls für das in dieser Datei erwartete Format hinzuweisen.

+0

Bedeutet das, dass standardmäßig keine Ausgabe produziert wird? In diesem Fall bin ich nicht glücklich damit. –

+0

Dies wird standardmäßig keine Ausgabe erzeugen. "Logging.NullHandler" ist nur in Python 2.7 verfügbar (und> 3.2 glaube ich), was ein Problem sein kann. Wenn Sie nur 'logger = logging.getLogger ('pyftpdlib')' verwenden, erhalten Sie standardmäßig Nachrichten und Sie können Ihre Benutzer einfach auf die 'logging.setLevel'- und' logging.setFormatter'-Dokumentation verweisen, um zu demonstrieren, wie die Ausgabe konfiguriert wird Nachrichten für Ihre Bibliothek. Sie können auch die Dateikonfiguration ['logging.config.fileConfig'] (http://docs.python.org/dev/library/logging.config.html#logging.config.fileConfig) verwenden, um Benutzern die Konfiguration zu ermöglichen Logger – Chris

+0

Um eine Ihrer ursprünglichen Fragen zu beantworten, werden in [PEP 282] (http://www.python.org/dev/peps/pep-0282/) die Vorteile der Protokollierung anstelle von Druckanweisungen kurz erwähnt: * Wenn ein einzelner Protokollierungsmechanismus in der Standardbibliothek enthalten ist, 1) wird die Protokollierung wahrscheinlich "gut" durchgeführt, und 2) mehrere Bibliotheken können in größere Anwendungen integriert werden, die einigermaßen kohärent protokolliert werden können. * – Chris

Verwandte Themen