Hier ist, was ich für ein similar question antwortete:
Die neue Linie, \n
, ist im Innern der emit(...)
Methode der eingesetzten StreamHandler
Klasse.
Wenn Sie wirklich sind eingestellt auf Festsetzung dieses Verhalten, dann ist hier ein Beispiel, wie ich dieses Problem gelöst durch monkey patching die emit(self, record)
Methode innerhalb der Klasse logging.StreamHandler.
Ein Affe-Patch ist eine Möglichkeit, den Laufzeitcode dynamischer Sprachen zu erweitern oder zu ändern, ohne den ursprünglichen Quellcode zu ändern. Dieser Prozess wurde auch als Entenstanzen bezeichnet.
Hier ist die kundenspezifische Implementierung von emit()
, die Zeilenumbrüche auslässt:
def customEmit(self, record):
# Monkey patch Emit function to avoid new lines between records
try:
msg = self.format(record)
if not hasattr(types, "UnicodeType"): #if no unicode support...
self.stream.write(msg)
else:
try:
if getattr(self.stream, 'encoding', None) is not None:
self.stream.write(msg.encode(self.stream.encoding))
else:
self.stream.write(msg)
except UnicodeError:
self.stream.write(msg.encode("UTF-8"))
self.flush()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
Dann würden Sie eine benutzerdefinierte Protokollierung Klasse machen (in diesem Fall Subklassen von TimedRotatingFileHandler
).
class SniffLogHandler(TimedRotatingFileHandler):
def __init__(self, filename, when, interval, backupCount=0,
encoding=None, delay=0, utc=0):
# Monkey patch 'emit' method
setattr(StreamHandler, StreamHandler.emit.__name__, customEmit)
TimedRotatingFileHandler.__init__(self, filename, when, interval,
backupCount, encoding, delay, utc)
Einige Leute könnten argumentieren, dass diese Art der Lösung nicht Pythonic, oder was auch immer ist. Es könnte so sein, also sei vorsichtig.
Beachten Sie auch, dass dies global SteamHandler.emit(...)
patchen wird. Wenn Sie also mehrere Protokollierungsklassen verwenden, wirkt sich dieser Patch auch auf die anderen Protokollierungsklassen aus!
Hoffe, dass hilft.
Sie möchten also mehrere Protokolleinträge verketten? Das Problem besteht darin, dass Protokolleinträge wie einzelne Zettel aussehen. Während der Druck auf demselben Blatt fortfährt, beginnt das Protokoll immer mit einem neuen, neuen. –
Ich habe hier eine Lösung gefunden http://stackoverflow.com/questions/3118059/how-to-write-custom-python-logging-handler?answertab=active#tab-top Es funktioniert für mich. – Maxim13
In Python> = 3.2 kann man ['StreamHandler.terminate = '''] (https://docs.python.org/3/library/logging.handlers.html#streamhandler) verwenden. – Ninjakannon