La nueva línea, \n
, se inserta dentro 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.
Consultar estas para la lectura adicional:
Espero que ayude.
Si desea registrar varias cosas en la misma línea, considere no usar 'logging' pero use un buen objeto antiguo y escriba directamente (y en un archivo diferente del archivo de registro utilizado para otros, basado en líneas) , cosas). – ThiefMaster
@ThiefMaster Estoy escribiendo en un archivo y stdout directamente en este momento. Sin embargo, siento que estoy reescribiendo el registro, así que prefiero usar el registro si resulta ser menos esfuerzo. –