【问题标题】:FileHandler not sending output to either location I wantFileHandler 没有将输出发送到我想要的任何一个位置
【发布时间】:2013-02-28 21:23:23
【问题描述】:

第一次玩日志模块。我真的有两个问题:

我在创建 FileHandler 时发现的所有示例都只使用了一个虚拟文件名,但我希望我的日志文件具有特定的标题格式。

log = time.strftime('./logs/'+'%H:%M:%S %d %b %Y', time.localtime())+'.log'
logger = logging.getLogger('myproject')
formatter = logging.Formatter('%(asctime)s %(message)s', '%H:%M:%S %d %b %Y')
handler = logging.FileHandler(log)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

这个似乎起初可以工作,因为创建了日志文件,但是当我杀死脚本并检查它时,里面什么都没有。在您建议使用with open(log) as f: 之前,在handler = logging.FileHandler(log) 中使用f 代替log 给了我关于文件甚至没有被创建的错误。我做错了什么没有写入日志文件?是不是因为我试图在文件名上过于聪明?

第二个问题可能以某种方式包含第一个问题。我真正想要的是一种同时写入控制台和日志文件的方法,因为这个脚本需要很长时间,我想衡量进度。我已经看到有关于如何做到这一点的答案,例如here,但所有这些似乎都假设我想要两个不同输出的不同级别的日志记录;我不。顺便说一句,我确实意识到,如果我的脚本没有动态生成日志文件的名称,我可以执行python myscript.py | tee log.file 之类的操作来避免制作不同的处理程序。

由于第一个问题涉及的变量,我觉得我无法回答第二个问题,但由于生病和随后的睡眠不足,我现在一头雾水。如果有人能像五岁的孩子一样向我解释如何以相同的输出同时写入控制台和日志文件,我将不胜感激。

非常感谢。

【问题讨论】:

  • 嗯。我想我是荣誉 Windows 开发者?我的脚本在. 中,我打算在位于同一位置的logs 中创建日志文件。就像我说的那样,文件确实被创建了,如果没有别的。
  • 肯定的;立即从 CLI 运行脚本并观察它做某事或什么都不做。
  • 好的,很好,我们已经过去了;现在让我看看我是否能找出真正的问题。 :)
  • 另一个可能很愚蠢的问题:您是使用logger.log 还是logging.log(或debug 等)进行记录;问题是您是否在返回的记录器上使用方法,或顶级模块函数)。
  • 不是一个愚蠢的问题。我自己也不知道。您在问题正文中看到的所有内容都是我如何拼凑而成的。我只是认为我需要超越文档中显示的基本日志记录。

标签: python logging


【解决方案1】:

您的代码正在配置一个名为“myproject”的记录器:

logger = logging.getLogger('myproject')
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

如果您在该记录器上使用方法,一切都会正常工作:

logger.info('foo bar')
logging.getLogger('myproject').info('foo bar')

但如果你只是使用模块级函数,它不会:

logging.info('foo bar')

为什么?因为模块级函数使用默认的根记录器,这不是您配置的。有关其工作原理的详细信息,请参阅the docs

通常,您处理此问题的方式是为每个模块创建一个模块级logger 对象,如下所示:

logger = logging.getLogger(__name__)

…或者类或实例属性logger,类似这样:

self.logger = logging.getLogger('{}.{}'.format(__name__, cls.__name__))

然后通过 loggerself.logger 对象执行所有操作,而不是通过模块级函数。

那么,为什么还有模块级函数呢?主要是为了方便简单的程序。如果这听起来适合您,并且您想使用它们,您可以;您只需要配置根记录器而不是其他记录器。将第一行改为:

logger = logging.getLogger()

现在,当您配置 logger 时,您也在配置模块级函数。

【讨论】:

  • 天哪。现在我可以tail -f myfile 观看输出。非常感谢这么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2015-04-08
  • 2020-06-12
  • 1970-01-01
  • 2018-03-29
相关资源
最近更新 更多