我已经将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)
我的配置文件中没有任何内容可以提供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
这是我主模块中的日志初始化代码:
import logging
import logging.config
import logging.handlers
logging.config.fileConfig('../conf/logging.conf')
logger = logging.getLogger('main')
我不是在寻找我在这里做错了什么(虽然那会很好),而是调试方法。
感谢。
答案 0 :(得分:4)
您可以深入研究Python源代码以研究这些问题。大部分库都是用Python实现的,并且非常易读,无需了解解释器的内部细节。 hg.python.org为存储库提供了便于浏览的Web界面。我找不到2.6的分支,但相关的声明在当前版本的第147行。
您可以看到args
是从eval生成的,该eval从配置文件的每个args
部分获取handler_*
密钥的值。然后使用unpack(*)操作扩展该args变量,以便为klass()创建参数。
在您的配置文件中,您有以下这一行:
args=('../log/audiosync.log')
这是一个20个字符的字符串,正在解压缩为单个字符元组,与传递给self
的{{1}}对象一起,在错误消息中占21个参数。您缺少制作1元素元组所需的尾随逗号:
__init__
同样的错误发生在args=('../log/audiosync.log',)
^-- missing
部分。
答案 1 :(得分:0)
追溯的最后两行包含单词handler
(handler = ...
和_install_handlers
)。这为您提供了查看配置文件中处理程序定义的起点。
如果一个函数需要5个参数,但是你以某种方式给出了超过4倍的数量,那么就没有按照你预期的方式解析某些东西了。特别是当您快速浏览配置文件时,不会显示该数字附近的任何内容。
我发现这种差异的最大原因之一是当函数期望列表,元组或对象时传递字符串。底层代码可以将该字符串拆分为字符并将其用于参数。
在你的情况下,我可以找到的第一个选项是你的配置中的这个块:
[handler_syslog]
class=FileHandler
level=WARN
formatter=timestamp
args=('../log/audiosync.sys.log')
它们本身没有21个字符串,但是如果从args中删除前导../
,则会留下log/audiosync.sys.log
这是一个21个字符的字符串。
那是他们的目标。使用pdb或可视调试器,例如PyCharm或PyDev。然后,您可以逐行遍历代码,并检查整个变量值。
某些模块允许您设置其日志记录级别。您可以将其设置为DEBUG
以查看开发人员设置为记录的所有内容。它可以帮助您在运行时跟踪应用程序的流程。我不认为这可用于ConfigParser模块,但有时可以使用。
The Python source code is available online。如果您正在获得半隐秘的回溯并且发现很难获得上下文,您可以随时下载源代码并手动运行代码。