【问题标题】:Logging Python stdout to File... with active stdout (backspacing/updating)使用活动的标准输出(退格/更新)将 Python 标准输出记录到文件...
【发布时间】:2012-04-14 09:04:16
【问题描述】:

好的,using this example,我正在将我的标准输出记录到文件中,并将其发送到终端。

但是当我查看日志文件时,没有处理退格,而是与输出一起打印。

有什么方法可以记录 python 脚本的标准输出的“最终”状态?

【问题讨论】:

  • 您可以使用正则表达式从您发送到文件的输出中去除不可打印的字符吗?
  • 但是我仍然看到每次更新迭代,不过是个好主意。
  • 事实证明,终端与平面文件日志有着根本的不同。一个被设计为临时的(因此是不可见的可更新的);另一个设计为 log.

标签: python logging stdout


【解决方案1】:

我正在使用 Python 的日志记录工具,并且遇到了同样的问题,它将正确的行尾序列“\x0D\x00\x0A\x00”转换为“\x0D\x0A\x00”。

如您所见,我想通过 Python 记录的程序输出是 UTF-16

为了避免 Python 做任何不同于将它从标准输出接收到的字节写入日志文件的事情,我尝试将 encoding="UTF-8" 添加到 logging.FileHandler()

结果是“\x0D”不再打印,而我得到“\x0A\x00\x0A\x00”。我猜这样会好一点。

在 Linux 上似乎没有问题。我在那里使用相同的脚本,但我的程序打印UTF-8 字符。

(这里有两个问题:为什么 Python 会添加另一个换行符?是否可以将其他信息记录到日志文件中?在字符串之前放置一个“U”或使用“...”。编码(UTF-16 ) 不起作用。但是否则日志文件将包含不同编码的字符串并变得无用...)

【讨论】:

    【解决方案2】:

    这是一个解决方案,它从您链接的答案中获取基本类,并为 \r\b 添加一些正则表达式处理:

    import sys
    import re
    
    class Logger(object):
        def __init__(self, filename="Default.log"):
            self.terminal = sys.stdout
            self.log = open(filename, "a")
            self.cr_pattern = re.compile("^.*\r", re.M)
            self.bs_pattern = re.compile(".\b")
    
        def write(self, message):
            self.terminal.write(message)
            message = self.bs_pattern.sub('', self.cr_pattern.sub('', message))
            self.log.write(message)
    
    sys.stdout = Logger("yourlogfilename.txt")
    print "Hello\rGoodbyee\b world!"
    

    示例运行:

    $ python test.py
    Goodbye world!
    $ cat yourlogfilename.txt
    Goodbye world!
    

    请注意,通常您应该对正则表达式使用原始字符串文字,这是您不应该使用的极少数情况之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2014-07-23
      • 2016-09-24
      • 2017-04-13
      • 1970-01-01
      • 2013-01-13
      相关资源
      最近更新 更多