我正在撕扯我的头发。
我需要一个syslog处理程序。
我找到了this: 在StackOverflow page,发现该方法可以很好地独立运行,与该系统的系统日志进行通信。
但是,我无法弄清楚如何在我的日志配置文件中引用它。我使用的是Python 2.6.6,因此我无法使用dict配置。我必须使用文件配置。根据文档,类名必须是相对于日志记录或来自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
这是什么试图告诉我的?什么模块不可调用?谁试图&#34;称之为&#34;?
查找自制日志记录处理程序并在日志记录配置文件中指定它的正确方法是什么?
答案 0 :(得分:1)
您应首先从平台特定文档开始: - )
Python 2.6提供SysLogHandler
如果您喜欢使用dict配置的日志记录配置,可以使用logutils包,它提供在Python 2.6中可用的dictionary based configuration。
我在Python 2.6中的logutils
中使用了很多,并且非常满意。后来转向Python 2.7非常容易。
答案 1 :(得分:1)
我认为你看到了这个错误,因为
class=logext.HDSysLogHandler
指定类为logext.HDSysLogHandler
的类,它是一个模块,而不是一个类。而是尝试
class=logext.HDSysLogHandler.HDSysLogHandler
因为它指定了HDSysLogHandler
模块中的logext.HDSysLogHandler
类。