将python输出重定向到文件会打印两行

时间:2011-12-12 15:19:44

标签: python logging

使用另一个堆栈溢出问题的建议我编写了自己的LogWriter类:

class LogWriter:
    def __init__(self, output, filename):
            self.output = output
            self.logfile = file(filename, 'a')

    def write(self, text):
            now = datetime.now()
            stamp = now.strftime("%Y-%m-%d - %I:%M:%S")
            text = "[%s] %s" % (stamp,text)
            if(DEBUG):
                    self.output.write(text)
                    self.output.flush()
            self.logfile.write(text)
            self.logfile.flush()

    def close(self):
            self.output.close()
            self.logfile.close()

然而,这是我收到的输出:

    >>logwriter = LogWriter(sys.stdout, LOG_FILENAME)
    >>sys.stdout = logwriter
    >>print "test"
    [2011-12-12 - 08:15:00] test[2011-12-12 - 08:15:00]

如果我删除修改文本并仅打印原始邮件的行,则该类按预期工作,打印到日志文件和标准输出:

test

由于某些原因,我的时间戳是重复的,我无法弄清楚原因。在python中修复此错误的正确方法是什么?

编辑:正如aix在下面所说,我假设打印调用和写入调用是一对一的,但事实并非如此。作为继续使用我的LogWriter类的简单修复,我现在正在进行如下调用:

...
def write(self, text):
            now = datetime.now()
            stamp = now.strftime("%Y-%m-%d - %I:%M:%S")
            text = "[%s] %s\n" % (stamp,text)
...
>>logwriter = LogWriter(sys.stdout, LOG_FILENAME)
>>logwriter.write("test")
[2011-12-12 - 08:38:55] test

2 个答案:

答案 0 :(得分:4)

尝试:

>>>print "test",

您可能会从print获取隐含的换行符,作为对write()的单独调用。无论哪种方式,问题是您正在多次调用write()(因为无法保证调用者如何使用write() - 如果它喜欢,它可以为每个字符调用它。)

答案 1 :(得分:2)

您不应该假设单个print语句会导致对write()的单次调用。因此,我认为在每个write()上生成时间戳的整个方法都存在缺陷。

您可以尝试通过在每个的开头生成一个时间戳来解决此问题(通过查找\n中的text个字符),但这不会触发我也特别优雅。