gpt4 book ai didi

python - 在 python 日志库中查找 "not enough arguments..."的简单方法

转载 作者:太空狗 更新时间:2023-10-29 21:57:35 25 4
gpt4 key购买 nike

您知道找到抛出“格式字符串参数不足”的日志记录调用的任何简单方法吗?在我的工作站上,我修改了 logging/__init__.py 以打印 msg,这样我就可以轻松地在源代码中找到该行。

但是你知道在无法更改 python 标准库或无法轻松运行 pdb 的测试环境中应该做什么吗?

注意:traceback是没有意义的,被日志库发现了。这是回溯:

  File "/usr/lib/python2.6/logging/handlers.py", line 71, in emit
if self.shouldRollover(record):
File "/usr/lib/python2.6/logging/handlers.py", line 144, in shouldRollover
msg = "%s\n" % self.format(record)
File "/usr/lib/python2.6/logging/__init__.py", line 648, in format
return fmt.format(record)
File "/usr/lib/python2.6/logging/__init__.py", line 436, in format
record.message = record.getMessage()
File "/usr/lib/python2.6/logging/__init__.py", line 306, in getMessage
msg = msg % self.args
TypeError: not enough arguments for format string

这是标准库中捕获错误的代码

    try:
if self.shouldRollover(record):
self.doRollover()
logging.FileHandler.emit(self, record)
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)

Alex 建议的解决方案:我包装了 getMessage 以打印消息和参数。这是代码:

def print_log_record_on_error(func):
def wrap(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except:
import sys
print >>sys.stderr, "Unable to create log message msg=%r, args=%r " % (
getattr(self, 'msg', '?'), getattr(self, 'args', '?'))
raise
return wrap
import logging
logging.LogRecord.getMessage = print_log_record_on_error(logging.LogRecord.getMessage)

最佳答案

通常,捕获异常(包括您提到的异常)的最佳方法是将可疑代码放在 try/try 子句中除了声明;在 except 子句中,您可以使用 traceback 模块或其他方式来查明错误语句。

否则未捕获的异常最终会出现在 sys.excepthook 中,如果需要,这是您可以用来获取回溯的另一种方式。

但是,我不认为 logging 模块有一个结构化的方式来告诉它“让异常传播”——在这种情况下,你最好的选择,尽管可能很脏,可能是猴子-修补。换句话说,您通常可以在运行时“更改 Python 标准库”——通过在其中将标识符设置为您自己的函数/类/等来包装标准库。例如,如果您知道问题出在 logging.warning 调用上,“概念验证”monkeypatch 可能是:

import logging, traceback

orgwarn = logging.warning
def mywarn(msg, *a):
try: res = msg % a
except TypeError:
traceback.print_exc()
return orgwarn(msg, *a)
logging.warning = mywarn

有更简洁的方法,但它们可能有些麻烦(例如,制作您自己的记录器类并将其设置为根记录器)。 Monkey-patching 不是在生产环境中运行的好方法(它对系统升级很脆弱,可能难以理解和维护等),但它可以用于调试和测试目的。

关于python - 在 python 日志库中查找 "not enough arguments..."的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2477934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com