Python日志配置文件模块和包
我快要抓狂了。
我需要一个系统日志处理器。
我在这个链接上找到了一个解决方案,来自StackOverflow,这个方法在独立运行时效果很好,能够和我这个系统的日志系统正常沟通。
但是,我不知道怎么在我的日志配置文件中引用它。我使用的是Python 2.6.6,所以不能用字典配置,只能用文件配置。根据文档,类名必须是相对于日志模块的,或者是完整的Python路径。
这是我的配置文件的一部分:
[handler_syslog]
class=logext.HDSysLogHandler
level=WARN
formatter=timestamp
args=(7, )
logext是一个包,位于我的主程序下一级。
它包含了3个Python文件和编译文件:
[logext]$ ls -al
total 32
drwxr-x---. 2 sc1478 dev 4096 Apr 25 11:50 .
drwxr-x---. 3 sc1478 dev 4096 Apr 25 11:50 ..
-rw-r-----. 1 sc1478 dev 243 Apr 25 11:50 HDSysLogHandler.py
-rw-r-----. 1 sc1478 dev 630 Apr 25 11:50 HDSysLogHandler.pyc
-rw-r-----. 1 sc1478 dev 2 Apr 25 11:50 __init__.py
-rw-r-----. 1 sc1478 dev 132 Apr 25 11:50 __init__.pyc
-rw-r-----. 1 sc1478 dev 2426 Apr 25 11:50 syslog_bridge.py
-rw-r-----. 1 sc1478 dev 2386 Apr 25 11:50 syslog_bridge.pyc
init.py是空的,只是为了创建一个包。
syslog.bridge.py基本上就是上面提到的文件,构造函数做了一些小改动,以便更灵活并兼容Python 2.6。
class SysLogLibHandler(logging.Handler):
...
def __init__(self, identifier, n):
try:
syslog.openlog(identifier, syslog.LOG_PID, self.FACILITY[n])
except Exception , err:
print err
raise
# We got it
logging.Handler.__init__(self)
最后,HDSysLogHandler.py的内容如下:
from syslog_bridge import SysLogLibHandler
class HDSysLogHandler(SysLogLibHandler):
def __init__(self, local_facility):
SysLogLibHandler.__init__(self, "hdaudio", local_facility)
主模块的相关部分是:
import logging
import logging.config
import logext
...
logging.config.fileConfig('logging.conf')
当我运行主应用时,我得到了这个:
Traceback (most recent call last):
File "Main.py", line 23, in <module>
logging.config.fileConfig('logging.conf')
File "/usr/lib64/python2.6/logging/config.py", line 84, in fileConfig
handlers = _install_handlers(cp, formatters)
File "/usr/lib64/python2.6/logging/config.py", line 162, in _install_handlers
h = klass(*args)
TypeError: 'module' object is not callable
这到底在告诉我什么?哪个模块不能被调用?谁在试图“调用”它?
找到一个自制的日志处理器并在日志配置文件中正确指定它的方式是什么?
2 个回答
1
你应该先查看特定平台的文档 :-)
Python 2.6 提供了一个叫做 SysLogHandler 的功能。
如果你喜欢用字典来配置日志设置,可以使用 logutils 这个包,它提供了可以在 Python 2.6 中使用的 基于字典的配置。
我在 Python 2.6 中经常使用 logutils
,感觉非常好。后来升级到 Python 2.7 也很简单。
1
我觉得你看到这个错误是因为
class=logext.HDSysLogHandler
这里指定的类是 logext.HDSysLogHandler
,但它其实是一个模块,而不是一个类。你应该试试
class=logext.HDSysLogHandler.HDSysLogHandler
因为这指定的是 HDSysLogHandler
类,它是在 logext.HDSysLogHandler
模块里面的。