【问题标题】:How to use python logging to log to files?如何使用 python 日志记录到文件?
【发布时间】:2014-06-18 19:48:28
【问题描述】:

我想使用 python logging 工具将输出记录到不同的文件(每个模块都有自己的日志文件)。因此,我在每个 python 模块 see examples 的开头添加如下内容:

... other imports ...
import logging
logger = logging.getLogger('factory')
fh = logging.FileHandler('log/factory.log')
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(funcName)s:%(lineno)d %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
... code ...

然后使用logger.info("text") 记录消息。但是,尽管正在创建名为log/factory.log 的文件,但没有数据写入!目录log 存在,我有权写入该目录。将logging 设施与basicConfig 一起使用可以正常工作...

【问题讨论】:

  • 您还必须在处理程序中设置日志记录级别,如答案所示。有关更多信息,请参阅this 问题。

标签: python logging


【解决方案1】:

更新

看起来它没有记录,因为 logger 的记录级别设置为 logging.WARN。您还必须将记录器上的级别显式设置为logging.DEBUG。我认为log/factory.log 文件没有被创建,因为日志消息还没有达到这一点。请参阅 http://dbgr.cc/v 了解以下代码的现场演示:

import logging
import os

os.makedirs("log")

logger = logging.getLogger('factory')
fh = logging.FileHandler('log/factory.log')
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(funcName)s:%(lineno)d %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

# notice that only the warning message is written
logger.debug("DEBUG MESSAGE")
logger.warn("WARNING MESSAGE")
logger.info("INFO MESSAGE")

with open("log/factory.log", "r") as f:
    print f.read()

# now update the level on the Logger to logging.DEBUG:
logger.setLevel(logging.DEBUG)

logger.debug("DEBUG MESSAGE")
logger.warn("WARNING MESSAGE")
logger.info("INFO MESSAGE")

with open("log/factory.log", "r") as f:
    print f.read()

http://dbgr.cc/7 演示以下代码:

import logging
import os

os.makedirs("log")

formatter = logging.Formatter('%(asctime)s %(levelname)s: %(funcName)s:%(lineno)d %(message)s')

# create logger with 'spam_application'
logger = logging.getLogger('factory')
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('log/factory.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)

# just so we can see things as they happen in stdout/stderr
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)

# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)

logger.debug("Debug log msg")
logger.info("Info log msg")
logger.warn("Warning log msg")

with open("log/factory.log", "r") as f:
    print f.read()

【讨论】:

  • 你的代码和他的主要区别在于你设置了fh级别,而他只设置了logger级别。您应该强调这种差异。
  • 是的,这是我忘记的“全局”日志记录级别!在我链接的示例中,我一定忽略了这一点。我有印象,级别仅通过fh.setLevel(logging.DEBUG) 设置...
猜你喜欢
  • 2015-07-11
  • 2018-09-08
  • 1970-01-01
  • 2011-09-17
  • 2014-07-21
  • 2015-09-19
  • 1970-01-01
  • 2011-06-12
  • 2020-01-03
相关资源
最近更新 更多