将python输出重定向到文件将打印两行
根据另一个堆栈溢出问题的建议,我编写了自己的LogWriter类:将python输出重定向到文件将打印两行,python,logging,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() stam
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
尝试:
您可能从print中获得隐式换行符,作为单独的write调用。无论哪种方式,问题都是您要编写多个调用,因为无法保证调用方如何使用write-如果愿意,它可以为每个字符调用write。尝试:
您可能从print中获得隐式换行符,作为单独的write调用。无论哪种方式,问题都是您将收到多个要写入的调用,因为无法保证调用方如何使用write-如果愿意,它可以为每个字符调用write。您不应该假设一个print语句导致一个要写入的调用。因此,我认为在每次写入时生成时间戳的整个方法是有缺陷的
您可以尝试通过在文本中查找字符,在每行的开头生成一个时间戳来解决此问题,但这也不会让我觉得特别优雅。您不应该假设一条print语句导致一次写入调用。因此,我认为在每次写入时生成时间戳的整个方法是有缺陷的
您可以通过在文本中查找字符,在每一行的开头生成一个时间戳来解决这个问题,但这也不会让我觉得特别优雅。对于我需要做的事情,我真的建议这样做太过分了,我只会进行4-5次日志调用,但我认为这是一种python式的日志记录方式,原来我错了!对于我需要做的事情,我真的建议这样做太过分了,我将只进行4-5次日志调用,但我认为这是一种python式的日志记录方式,结果证明我错了!你说得对。我以前曾假设多行打印仍然会导致一次调用写入。似乎换行符发生在换行符上,因此我分别得到了“test”和“\n”。我要放弃这种方法,你说得对。我以前曾假设多行打印仍然会导致一次调用写入。似乎换行符发生在换行符上,因此我分别得到了“test”和“\n”。我将放弃这种方法。没有这样的运气,仍然会产生与上面相同的打印语句。没有这样的运气,仍然会产生与上面相同的打印语句。
>>>print "test",