Esto es lo que respondió por un similar question:
La nueva línea, \n
, se inserta en el interior método emit(...)
de la clase StreamHandler
.
Si realmente fijan en fijación de este comportamiento, entonces aquí es un ejemplo de cómo resolví esto mediante el método monkey patchingemit(self, record)
dentro de la clase logging.StreamHandler.
Un parche mono es una forma de ampliar o modificar el código de tiempo de lenguajes dinámicos sin alterar el código fuente original. Este proceso también se ha denominado perforación de patos.
Aquí está la implementación personalizada de emit()
que omite los saltos de línea:
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)
allí tendría que hacer una clase de registro personalizado (en este caso, la subclasificación de 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)
Algunas personas podrían argumentar que este tipo de solución no es Pythonic, o lo que sea. Puede ser así, así que ten cuidado.
Además, tenga en cuenta que esto parcheará globalmente SteamHandler.emit(...)
, por lo que si está utilizando varias clases de registro, entonces este parche también afectará a las otras clases de registro.
Espero que ayude.
¿Desea concatenar varias entradas de registro? El problema es que las entradas de registro son como pedazos de papel separados. Mientras que la impresión sigue escribiendo en la misma hoja, el registro en realidad siempre comienza con uno nuevo. –
He encontrado una solución aquí http://stackoverflow.com/questions/3118059/how-to-write-custom-python-logging-handler?answertab=active#tab-top Funciona para mí. – Maxim13
En Python> = 3.2, se puede usar ['StreamHandler.terminate = '''] (https://docs.python.org/3/library/logging.handlers.html#streamhandler). – Ninjakannon