11

例如,当我这样做时,我想取消换行符 log.info(“msg”)。当我们“打印”它时

print msg,

所以我需要像昏迷这样的东西来记录日志。

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

4

2 回答 2

7

这是我对类似问题的回答:

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

如果您真的打算修复此行为,那么这里有一个示例,说明我如何通过猴子修补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(...),因此如果您使用多个日志记录类,则此补丁也会影响其他日志记录类!

希望有帮助。

于 2012-11-14T05:14:08.307 回答
5

这是不可能的(没有对日志模块的严重入侵)。如果您必须具有此功能,请分段构建日志记录字符串,并在您准备好显示带有换行符的日志消息时记录它。

于 2012-10-02T23:14:07.913 回答