gpt4 book ai didi

python - 如何追溯日志错误?

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:20 26 4
gpt4 key购买 nike

我使用 logging在我的应用程序上记录消息的模块。

我经常遇到格式字符串或参数错误导致错误的情况,例如:

import logging
my_log = logging.getLogger("MyLog")
# this is obviously wrong
my_log.info('%d', "abc")

结果是类似于下面的错误:

Traceback (most recent call last):
File "/usr/lib64/python2.6/logging/__init__.py", line 776, in emit
msg = self.format(record)
File "/usr/lib64/python2.6/logging/__init__.py", line 654, in format
return fmt.format(record)
File "/usr/lib64/python2.6/logging/__init__.py", line 436, in format
record.message = record.getMessage()
File "/usr/lib64/python2.6/logging/__init__.py", line 306, in getMessage
msg = msg % self.args
TypeError: %d format: a number is required, not str

但是,它只是显示了日志记录模块中的回溯;它没有告诉我错误发生在我的代码中的什么地方。

有什么办法可以解决吗?

最佳答案

我在查找错误源时遇到了同样的问题。日志记录模块处理此类异常并且不停止程序——这是日志模块可接受的行为。但是在处理异常时抑制异常并且没有提供足够的信息。

我发现并正在使用 thick 描述的 here

诀窍是用异常处理子句包装调用的函数替换执行字符串格式化的非常基本的日志记录函数 logging.LogRecord.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)

logging.basicConfig()
my_log = logging.getLogger("MyLog")
# this is obviously wrong
my_log.error('%d' , "abc")

现在它会产生更有用的异常:

Unable to create log message msg='%d', args=('abc',) 
Traceback (most recent call last):
File "C:\Progs\Python262\Lib\logging\__init__.py", line 760, in emit
msg = self.format(record)
File "C:\Progs\Python262\Lib\logging\__init__.py", line 644, in format
return fmt.format(record)
File "C:\Progs\Python262\Lib\logging\__init__.py", line 432, in format
record.message = record.getMessage()
File "C:/Users/vvlad/PycharmProjects/stackoverflow/test1.py", line 6, in wrap
return func(self, *args, **kwargs)
File "C:\Progs\Python262\Lib\logging\__init__.py", line 302, in getMessage
msg = msg % self.args
TypeError: %d format: a number is required, not str

如果您有日志密集型应用程序,我建议添加选项来替换登录功能。因此 oin Debug模式代码将使用重载函数,但在生产中它不会这样你将避免一个额外的异常处理的性能损失。

关于python - 如何追溯日志错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13459085/

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