HOWTO调试pythion日志记录配置文件错误

时间:2014-04-11 20:18:55

标签: 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)

我的配置文件中没有任何内容可以提供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')

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

感谢。

2 个答案:

答案 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)

寻找关键字

追溯的最后两行包含单词handlerhandler = ..._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或可视调试器,例如PyCharmPyDev。然后,您可以逐行遍历代码,并检查整个变量值。

更改日志记录级别

某些模块允许您设置其日志记录级别。您可以将其设置为DEBUG以查看开发人员设置为记录的所有内容。它可以帮助您在运行时跟踪应用程序的流程。我不认为这可用于ConfigParser模块,但有时可以使用。

如果其他所有方法都失败了,请阅读来源

The Python source code is available online。如果您正在获得半隐秘的回溯并且发现很难获得上下文,您可以随时下载源代码并手动运行代码。