2016-01-06 79 views
2

我使用'记录器'类(源自另一个SO答案),以便在使用打印(或类似)命令时同时写入日志文件和终端。Python'记录器'类重复时间戳

我修改了记录器,以便它用一个时间戳预先记录所有消息。但是,它也附加了不需要的时间戳。所以我最终在每一行的开头和结尾都加上了时间戳。

下面的示例代码被修改为用文本文本“BLAH”替换实际的时间戳代码,以证明它出现在任何文本中,并且与用于获取时间戳的方法无关。

class Logger(object): 
    def __init__(self): 
     self.terminal = sys.stdout 
     self.log = open(r"C:\Temp\gis_list2reference.txt", "a") 

    def write(self, msg): 
     line = "%s %s" % ("BLAH", msg) 
     self.terminal.write(line) 
     self.terminal.flush() 
     self.log.write(line) 
     self.log.flush() 

## #this flush method is needed for python 3 compatibility. 
## def flush(self): 
##  pass 

sys.stdout = Logger() 

print "some log text" 

的输出,终端和日志文件,是:

BLAH some log textBLAH 

如何避免额外的“嗒嗒”(或时间戳)在每一行的末尾未登录的状态?

为什么会记录?

编辑:

按照下面的接受的答案,下面的代码工作(尽管它显然不是一个“Python化”整洁的方式做到这一点:

class Logger(object): 
    def __init__(self): 
     self.terminal = sys.stdout 
     self.log = open(r"C:\Temp\gis_list2reference.txt", "a") 

    def write(self, msg): 
     if msg != "\n": 
      msg = "%s %s" % (strftime("%Y-%m-%d %H:%M:%S"), msg) 
     self.terminal.write(msg) 
     #self.terminal.flush() 
     self.log.write(msg) 
     self.log.flush() 

## #this flush method is needed for python 3 compatibility. 
## def flush(self): 
##  pass 

sys.stdout = Logger() 
+4

使用Python自带的日志记录模块。创建一个记录器并注册一个流处理程序和一个文件处理程序。你在做什么不是解决你的问题的pythonic方式 – brunsgaard

+0

@brunsgaard是正确的。使用[日志记录](https://docs.python.org/3/library/logging.html) –

+0

据我所知,日志记录模块似乎没有写入终端(通过快速浏览DOCO)。我需要写入两个终端,并为每个“打印”(或等价物)记录文件。记录模块可以做到这一点吗? –

回答

2

当你在做

print "some log test" 

Python会打电话给你的对象两次

​​

BLAH一些日志textoutput BLAH \ n

明白了吗? :)

为了避免这种错误,你可以添加ň特殊情况下为\或只使用一个真正的logging.Logger :)

+1

因此'print'命令使用单独的“\ n”调用?我没有意识到这一点。你的答案似乎是现货。我想,我还需要调查记录器类。 –

+0

@SonofaBeach酷,接受它然后:)。我也认为最pythonic的方式是日志模块... –

+0

我同意它不是最pythonic的方式,但(如上)记录模块提供的功能同时登录到终端和日志文件每个“打印”(或同等)? –