Python 日志记录配置文件模块和包

Posted

技术标签:

【中文标题】Python 日志记录配置文件模块和包【英文标题】:Python logging config file modules and packages 【发布时间】:2014-06-11 14:13:04 【问题描述】:

我在扯头发。

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

我找到了this: 在*** page 处,发现该方法独立工作正常,可以与该系统的系统日志进行通信。

但是,我不知道如何在我的日志记录配置文件中引用它。我使用的是 Python 2.6.6,所以我无法使用 dict config。我必须使用文件配置。根据文档,类名必须相对于日志记录或 python 路径的完整规范。

这是我的配置文件的部分:

[handler_syslog]
class=logext.HDSysLogHandler
level=WARN
formatter=timestamp
args=(7, )

logext 是一个比我的 main 更深一层的包。

它包含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

这是想告诉我什么?什么模块不可调用?谁在试图“称呼它”?

找到自制的日志处理程序并在日志配置文件中指定它的正确方法是什么?

【问题讨论】:

【参考方案1】:

您应首先从特定于平台的文档开始 :-)

Python 2.6 提供SysLogHandler

如果你喜欢使用 dict 配置的日志配置,你可以使用logutils 包,它提供了在 Python 2.6 中可用的dictionary based configuration。

我在 Python 2.6 中的 logutils 中使用了很多,并且对它非常满意。后来迁移到 Python 2.7 非常容易。

【讨论】:

你让我走上了正确的道路,logutils 让日志记录在 py2.6 上工作【参考方案2】:

我认为您看到此错误是因为

class=logext.HDSysLogHandler

将类指定为logext.HDSysLogHandler,它是一个模块,而不是一个类。而是尝试

class=logext.HDSysLogHandler.HDSysLogHandler

因为这指定了HDSysLogHandler 类,它位于logext.HDSysLogHandler 模块内。

【讨论】:

谢谢!我喜欢 python,除非我讨厌它。 :-) 让我困惑的是 class=handlers.SysLogHandler 的例子。在这种情况下,处理程序是一个包含多个类的模块,其中一个是 SysLogHandler,而在我的情况下,该模块包含一个同名的类。难怪我有时讨厌 python。

以上是关于Python 日志记录配置文件模块和包的主要内容,如果未能解决你的问题,请参考以下文章

基础入门_Python-模块和包.运维开发中日志模块logging的最佳实践?

python日志模块记录三_日志命名_日志轮转

基础入门_Python-模块和包.深入Celery之应用配置/独立模块配置实践?

Python日志模块logging使用详解

基础入门_Python-模块和包.运维开发中watchdog事件监视的最佳实践?

17.3.12---logging日志模块level配置操作