我使用'记录器'类(源自另一个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()
使用Python自带的日志记录模块。创建一个记录器并注册一个流处理程序和一个文件处理程序。你在做什么不是解决你的问题的pythonic方式 – brunsgaard
@brunsgaard是正确的。使用[日志记录](https://docs.python.org/3/library/logging.html) –
据我所知,日志记录模块似乎没有写入终端(通过快速浏览DOCO)。我需要写入两个终端,并为每个“打印”(或等价物)记录文件。记录模块可以做到这一点吗? –