Python中使用日志记录模块的奇怪问题

时间:2015-08-28 00:49:08

标签: python debugging error-logging

当我在我正在处理的应用程序中调用另一个模块后记录数据时,我似乎遇到了问题。我想帮助理解这里可能发生的事情。

为了复制这个问题,我开发了以下脚本......

#!/usr/bin/python

import sys
import logging
from oletools.olevba import VBA_Parser, VBA_Scanner
from cloghandler import ConcurrentRotatingFileHandler

# set up logger for application
dbg_h = logging.getLogger('dbg_log')
dbglog = '%s' % 'dbg.log'
dbg_rotateHandler = ConcurrentRotatingFileHandler(dbglog, "a")
dbg_h.addHandler(dbg_rotateHandler)
dbg_h.setLevel(logging.ERROR)

# read some document as a buffer
buff = sys.stdin.read()

# generate issue
dbg_h.error('Before call to module....')
vba = VBA_Parser('None', data=buff)
dbg_h.error('After call to module....')

当我运行时,我得到以下内容......

cat somedocument.doc | ./replicate.py
ERROR:dbg_log:After call to module....

由于某种原因,我上次的dbg_h记录器写入尝试是输出到控制台以及写入我的dbg.log文件?这似乎只是在调用VBA_Parser之后发生。

cat dbg.log
Before call to module....
After call to module....

任何人都知道为什么会发生这种情况?我查看了source code of olevba并没有看到任何特别突出的内容。

这可能是我应该向模块作者提出的问题吗?或者我是否在使用cloghandler我做错了什么?

1 个答案:

答案 0 :(得分:0)

Intent call = new Intent(Intent.ACTION_DIAL); call.setData(Uri.parse("tel:"+phone)); //String phone startActivity(call); 代码库通过调用oletoolslogging.debug(...)等来调用root logger。由于作者没有费心配置根记录器,因此默认行为是转储到logging.error(...)。由于sys.stderr在从命令行运行时默认使用控制台,因此您可以获得您所看到的内容。

您应该与sys.stderr的作者联系,因为他们没有有效地使用日志记录系统。理想情况下,他们会使用命名记录器并将消息推送到该记录器。作为解决消息的解决方法,您可以将根记录器配置为使用处理程序。

oletools

请注意,这可能会导致重复的日志消息。