Новая строка, \n
, вставлена в класс StreamHandler
.
Если вы действительно настроили на исправление такого поведения, то вот пример того, как я решил это путем исправления обезьяны метода emit(self, record)
внутри класса logging.StreamHandler.
Патч обезьяны - это способ расширения или изменения кода динамических языков во время выполнения без изменения исходного исходного кода. Этот процесс также называют штамповкой утки.
Вот пользовательская реализация emit()
, которая пропускает разрывы строк:
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)
Тогда вы создадите пользовательский класс ведения журнала (в данном случае подклассы от 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)
Некоторые люди могут утверждать, что этот тип решения не Pythonic , или что-то еще. Это может быть так, так что будьте осторожны.
Также имейте в виду, что это глобально исправит SteamHandler.emit(...)
, поэтому, если вы используете несколько классов ведения журнала, то это исправление повлияет и на другие классы ведения журнала!
Проверьте это для дальнейшего чтения:
Надеюсь, это поможет.