如何调试Python日志记录配置文件错误

Ste*_*hen 1 python logging

我已经在代码中添加了Python的日志记录模块,以摆脱混乱的打印语句,而且配置错误也使我感到困惑。错误消息不是很有用。

Traceback (most recent call last):
  File "HDAudioSync.py", line 19, in <module>
    logging.config.fileConfig('../conf/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: __init__() takes at most 5 arguments (21 given)
Run Code Online (Sandbox Code Playgroud)

我的配置文件中没有任何内容提供21个参数。

这是配置文件

[loggers]
keys=root,main, sftp, jobapi

[handlers]
keys=console, logfile, syslog

[formatters]
keys=simple, timestamp

[logger_root]
level=NOTSET
handlers=logfile

[logger_main]
level=DEBUG
handlers=console, logfile, syslog
propagate=1
qualname=main


[logger_sftp]
level=DEBUG
handlers=console, logfile, syslog
propagate=1
qualname=sftp


[logger_jobapi]
level=DEBUG
handlers=console, logfile, syslog
propagate=1
qualname=jobapi

[handler_console]
class=StreamHandler
level=DEBUG
formatter=simple
args=(sys.stdout,)

[handler_logfile]
class=FileHandler
level=DEBUG
formatter=timestamp
args=('../log/audiosync.log')


[handler_syslog]
class=FileHandler
level=WARN
formatter=timestamp
args=('../log/audiosync.sys.log')

[formatter_simple]
format=%(levelname)s - %(message)s

[formatter_timestamp]
format=%(asctime)s - %(name)s -%(levelname)s - %(message)s
Run Code Online (Sandbox Code Playgroud)

这是我的主模块中的日志记录初始化代码:

import logging
import logging.config
import logging.handlers

logging.config.fileConfig('../conf/logging.conf')
logger = logging.getLogger('main')
Run Code Online (Sandbox Code Playgroud)

我不是在寻找我在这里做错了什么(尽管那会很好),而不是在寻找调试它的方法。

谢谢。

Kev*_*eau 5

您可以深入研究Python源代码以研究此类问题。该库的大部分是用Python实现的,并且无需了解解释器的内部细节就可以很好地读取。hg.python.org提供了一个到存储库的Web界面,方便浏览。我找不到2.6的分支,但相关的语句在当前版本的第147行。

您可以看到它args是从一个eval生成的,该eval argshandler_*配置文件的每个部分获取密钥的值。然后使用unpack(*)操作扩展该args变量,以创建klass()的参数。

在您的配置文件中,您具有以下这一行:

args=('../log/audiosync.log')
Run Code Online (Sandbox Code Playgroud)

它是一个20个字符的字符串,将被解包为单个字符的元组,该字符串与self传递给的对象一起__init__占错误消息中的21个参数。您缺少制作1元素元组所需的结尾逗号:

args=('../log/audiosync.log',)
                            ^-- missing
Run Code Online (Sandbox Code Playgroud)

该部分中存在相同的错误handler_syslog