【发布时间】:2016-01-06 22:53:44
【问题描述】:
我正在使用“记录器”类(来自另一个 SO 答案),以便在使用打印(或类似)命令时同时写入日志文件和终端。
我已经修改了记录器,以便在所有消息前面加上时间戳。但是,它还附加了时间戳,这是不希望的。所以我在每一行的开头和结尾都有时间戳。
修改下面的示例代码,将实际的时间戳代码替换为文字“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
如何避免在记录的每行末尾出现额外的“BLAH”(或时间戳)?
为什么会被记录?
编辑:
根据下面接受的答案,以下代码有效(尽管它显然不是一种“pythonic”的简洁方式:
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 是正确的。使用logging
-
据我所知,日志模块似乎没有写入终端(从快速浏览文档)。我需要为每个“打印”(或等效项)写入终端和日志文件。日志模块可以做到这一点吗?
标签: python logging stdout stderr