如何登录文件&标准输出

时间:2014-09-17 17:46:33

标签: python

我设置了以下日志记录:

import logging
logging.basicConfig(level=logging.DEBUG,
                format='[%(asctime)s] - %(funcName)s - %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='/tmp/affiliate.log',
                filemode='w')

我如何转换以下两个语句 - 写入日志文件然后打印输出:

logging.debug('>>>>> 401 Error: Cannot download file')
print '>>>>> 401 Error: Cannot download file'

进入一个同时执行这两个操作的日志语句?

1 个答案:

答案 0 :(得分:6)

你不能只用basicConfig(至少在Python 2.7中没有; 3.3添加新功能,特别是handlers参数),但是设置记录器很容易写到两个地方。 Logging Cookbook解释了如何详尽地完成各种事情。

一些菜谱条目没有完整解释,只是演示了,但您始终可以在logging文档中查找详细信息。

您在这里寻找的关键是创建两个处理程序 - FileHandler('/tmp/affiliate.log')StreamHandler(sys.stdout)

如果您希望日志文件和stdout中的格式,日志级别等相同,one of the early examples in the cookbook就会执行此操作,但stderr除外。如果您想要各自的格式the very next example does that

所以,而不是:

logging.basicConfig(level=logging.DEBUG,
                format='[%(asctime)s] - %(funcName)s - %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='/tmp/affiliate.log',
                filemode='w')

这样做:

logger = logging.getLogger('')
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('/tmp/affiliate.log')
sh = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('[%(asctime)s] - %(funcName)s - %(message)s',
                               datefmt='%a, %d %b %Y %H:%M:%S')
fh.setFormatter(formatter)
sh.setFormatter(formatter)
logger.addHandler(fh)
logger.addHandler(sh)

请注意,我链接的第二个示例使用basicConfig执行它可以执行的所有操作,然后在其上添加第二个处理程序。我认为这有点不太清楚,但如果你想做同样的事情,你就可以做到。