Python日志配置文件模块和包

3 投票
2 回答
1009 浏览
提问于 2025-04-18 04:16

我快要抓狂了。

我需要一个系统日志处理器。

我在这个链接上找到了一个解决方案,来自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 模块里面的。

撰写回答