【问题标题】:How to log to file & stdout如何记录到文件和标准输出
【发布时间】:2014-09-17 17:46:32
【问题描述】:

我设置了以下日志记录:

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'

合并到一个同时兼顾两者的日志语句中?

【问题讨论】:

标签: python


【解决方案1】:

您不能仅使用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 来完成它可以做的所有事情,然后在其之上添加第二个处理程序。我认为这有点不太清楚,但如果你想这样做,你可以这样做。

【讨论】:

  • 您可以在 Python 3.3+ 中通过 handlers 参数仅使用 basicConfig() 来实现。
  • @J.F.Sebastian 好点。 OP 显然使用的是 2.x,但对于未来的搜索者来说,这值得一提。
猜你喜欢
  • 2013-01-13
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多