Ich habe viel Code auf ein Projekt mit print-Anweisungen und wollte schnell eine schmutzige Logger dieser Druckanweisungen machen und entschied sich für die benutzerdefinierte Route gehen. Ich habe es geschafft, einen Logger zusammenzustellen, der sowohl auf das Terminal als auch auf eine Datei druckt (mit Hilfe dieser Seite), aber jetzt möchte ich jeder Aussage einen einfachen Zeitstempel hinzufügen, und ich stoße auf ein komisches Problem.Benutzerdefinierte Logger mit Zeitstempel in Python
Hier ist meine Protokollierungsklasse.
class Logger(object):
def __init__(self, stream):
self.terminal = stream
self.log = open("test.log", 'a')
def write(self, message):
self.terminal.flush()
self.terminal.write(self.stamp() + message)
self.log.write(self.stamp() + message)
def stamp(self):
d = datetime.today()
string = d.strftime("[%H:%M:%S] ")
return string
Beachten Sie die Stempelmethode, die ich dann versuche, in der Schreibmethode zu verwenden.
Wenn die folgenden zwei Zeilen laufen bekomme ich einen unerwarteten Ausgang:
sys.stdout = Logger(sys.stdout)
print("Hello World!")
Ausgang:
[11:10:47] Hello World![11:10:47]
Das, was die Ausgabe sieht auch in der Log-Datei, aber ich sehe keinen Grund, warum Die Zeichenfolge, die ich hinzufüge, hängt an das Ende an. Kann mir hier jemand helfen?
UPDATE Siehe Antwort unten. Zur schnelleren Bezugnahme wird das Problem jedoch generell mit "print()" behoben. Ersetzen Sie es nach dem Zuweisen der Variablen durch sys.stdout.write.
Verwenden Sie auch "Logging" für langfristige/größere Projekte auf Anhieb.
Ich bin mir bewusst, dass Python eingebaute Logging-Fähigkeit hat. Derzeit befindet sich mein Projekt in einem Freeze-Point, so dass ich keine größeren Änderungen vornehmen kann, sondern nur schnelle und schmutzige Fixes. Bis dahin, dass ich mit dem oben genannten Modul einen besseren Logger implementieren kann, möchte ich, wenn möglich, nur mein aktuelles Problem beheben. Wenn "logging" keine regulären print-Anweisungen sowohl an stdout als auch an eine Datei ausgeben kann, löst das mein Problem nicht. – Tristan
Python-Logger können mehrere Handler haben, _ie_: sowohl Konsole als auch Datei gleichzeitig. IMHO würde ich nicht in Betracht ziehen, das integrierte Protokollierungsmodul von Python als _major change_ zu verwenden. IMO ist es einfach zu bedienen und schnell zu implementieren. Und es gibt viele Vorteile - zum Beispiel können Sie es leicht ein-/ausschalten. IMO eine benutzerdefinierte Logger von Grund auf neu ist eine viel größere Herausforderung. :) –
OK! Sie haben mich mit dem Detailreichtum dieses Outputs vertraut gemacht. Ich bin jedoch immer noch neugierig, warum meine vorherige Implementierung so eine seltsame Sache machen würde. – Tristan