2011-12-12 76 views
1

使用的另一个堆栈溢出问题,我写我自己写进程类的建议:重定向蟒蛇输出到文件打印两行

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] 

如果我删除修改文本并只打印原始邮件的行,该类按预期工作,打印到日志文件和stdout:

test 

出于某种原因,我的时间戳是重复的,我找不到原因。在python中修复这个错误的正确方法是什么?

编辑:正如下面aix所说,我假定打印电话和写电话是一对一的,但事实并非如此。举一个简单的修复继续使用我的日志写I类现在正在做的电话如下:

... 
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

我真的会推荐http://docs.python.org/library/logging.html – Jdog

+0

这对于我需要做的事情来说是过分的,我只会做4-5个日志调用,但我认为这是一个pythonic方式做伐木,原来我错了! –

回答

2

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

您可以尝试通过产生在每个线开始时间戳(通过寻找text\n字符)解决这个问题,但是,这并不罢工我是特别优雅无论是。

+0

你说得对。我以前认为多行打印仍然会导致一次写入调用。看来这个突破发生在一个换行符上,所以我分别获得了'测试'和'\ n'。我将放弃这种方法。 –

4

尝试:

>>>print "test", 

也许你从print得到隐含换行符作为write()单独调用。无论哪种方式,问题是你有多次致电write()(因为不能保证呼叫者如何使用write() - 如果喜欢,它可以为每个角色调用它)。

+0

没有这样的运气,仍然会产生与上面相同的打印声明。 –