如何在Python日志记录模块中抑制换行符。

时间:2012-10-02 22:59:41

标签: python logging

我想取消换行,例如log.info(“msg”)。 当我们“打印”它只是

print msg,

所以我需要像昏迷这样的记录。

我播种了这个问题 Suppress newline in Python logging module 但任何人都可以给我参考或像“Hello world”这样的简单例子 谢谢!

2 个答案:

答案 0 :(得分:6)

以下是我为similar question回答的内容:

新行\n已插入StreamHandler类的emit(...)方法中。

如果您真的设置了 fix 这种行为,那么这里是一个示例,说明我是如何通过monkey patching logging.StreamHandler类中的emit(self, record)方法解决这个问题的。

  

猴子补丁是一种在不改变原始源代码的情况下扩展或修改动态语言的运行时代码的方法。这个过程也被称为鸭子冲孔。

以下是省略换行符的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(...),因此如果您使用多个日志记录类,那么此修补程序也会影响其他日志记录类!

希望有所帮助。

答案 1 :(得分:4)

这是不可能的(没有严重侵入日志记录模块)。如果必须具有此功能,请在准备好使用换行符显示日志消息时,在部分中构建日志记录字符串并将其记录下来。