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

11
我想在执行例如log.info("msg")时取消换行。当我们使用"print"时它只是...

我想让当我执行log.info("msg")时,不要打印出额外的换行符。然而,当我们使用"print"时,它会自动添加一个换行符。

print msg,

所以我需要像日志记录一样的逗号。

我看到了这个问题“在Python日志模块中抑制换行符”,但有人能否给我一个参考或像“Hello world”一样简单的例子呢?谢谢!


1
所以你想要连接多个日志条目?问题在于日志条目就像是独立的纸张。虽然打印会继续在同一张纸上写,但日志实际上总是从新的一张纸开始。 - Jure C.
2
我在这里找到了解决方案https://dev59.com/knA75IYBdhLWcg3wxcDV?answertab=active#tab-top。它对我很有效。 - Maxim13
在Python >= 3.2中,可以使用StreamHandler.terminate = '' - Ninjakannon
2个回答

7

以下是我为一个类似问题所做的回答(原链接):

新行符\n被插入到StreamHandler类的emit(...)方法内。

如果你真的想要修复这个问题,那么下面是我通过monkey patching方式来解决这个问题的示例,即在logging.StreamHandler类中修改emit(self, record)方法。

Monkey patch是一种不改变原始源代码,扩展或修改动态语言运行时代码的方法。这个过程也被称为“duck punching”。

以下是自定义的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(...),因此如果您正在使用多个日志记录类,则此修补程序也会影响其他日志记录类!

希望这可以帮到你。


5

这是不可能的(除非严重破坏日志模块)。如果您必须具有此功能,请逐步构建日志字符串,仅当您准备显示带有换行符的日志消息时再进行日志记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接