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

Max*_*m13 11 python logging

我想取消换行符,例如log.info("msg").当我们"打印"它时

print msg,
Run Code Online (Sandbox Code Playgroud)

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

我播下这个问题 在Python日志模块中抑制换行, 但是任何人都可以给我参考或者像"Hello world"这样的简单例子谢谢!

pja*_*ama 6

以下是我对类似问题的回答:

新行\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)
Run Code Online (Sandbox Code Playgroud)

然后,您将创建一个自定义日志记录类(在本例中,从子类化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)
Run Code Online (Sandbox Code Playgroud)

有些人可能会说这种解决方案不是Pythonic,或者其他什么.可能是这样,所以要小心.

另外,请注意这将全局修补SteamHandler.emit(...),因此如果您使用多个日志记录类,那么此修补程序也将影响其他日志记录类!

希望有所帮助.


Han*_*hen 5

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