gpt4 book ai didi

具有额外选项的 Python/Django 日志记录

转载 作者:行者123 更新时间:2023-12-01 05:16:52 24 4
gpt4 key购买 nike

我在 Django 中有一个日志配置文件,它需要 sys.exc_info() tuple & 在记录时将它们作为额外选项传递(请参阅下面格式化程序中的变量 typevalue)

'formatters': {
'basic': {
'format': '%(levelname)s %(lineno)d %(message)s %(type)s %(value)s'
},
},

以下是我记录错误的方法:

    except Exception, e:
extra = {'type':sys.exc_info()[0], 'value':sys.exc_info()[1]}
logger.warning('My message', extra=extra)

但是如果我只是写

    except Exception, e:
logger.warning('My message')

我收到异常,因为变量 type & value现在在格式化程序中未定义。如何告诉格式化程序将这些变量视为可选变量,即如果我在记录时传递它们,则使用它们,否则跳过它们。

最佳答案

我建议您不要在日志记录调用中显式传递exc_info 元组部分。相反,请注意,如果发生异常并且您传递 exc_info=Trueexc_info=sys.exc_info(),则元组已存储在 LogRecordexc_info 属性。您可以在格式化程序中访问这些内容,因此您可以使用 Formatter 子类或 Filter 子类将元组的部分内容转换为其他 LogRecord可以在格式字符串中引用的属性(或者甚至由自定义 Formatter 子类处理)。

更新:可以在格式字符串中引用为%(exc_info)s,但这只会显示元组。请注意,可以重写 FormatterformatException 方法来显示异常。默认情况下将格式化标准回溯 - 我是否理解您希望这种情况发生?

class MyFormatter(logging.Formatter):
def formatException(self, exc_info):
return 'exception: %s %s' % exc_info[:2])

这将打印一行而不是完整的回溯,但在一个新行上。或者您可以使用如下方法:

class MyFormatter(logging.Formatter):
def format(self, record):
if isinstance(record.exc_info, tuple):
record.exc_data = ' %s %s' % record.exc_info[:2]
else:
record.exc_data = ''
return super(MyFormatter, self).format(record)

def formatException(self, exc_info):
return ''

然后使用其中包含 %(exc_data)s 的格式字符串。

对于这两种情况,您需要确保将真实的 exc_info 传递到日志记录调用中,以确保异常数据保存在 LogRecord 中。记录器的 exception() 方法执行此操作(级别为 ERROR)。

进一步更新:要使用 Filter 子类执行此操作,您可以执行以下操作:

class MyFilter(logging.Filter):
def filter(self, record):
if isinstance(record.exc_info, tuple):
record.exc_data = ' %s %s' % record.exc_info[:2]
else:
record.exc_data = ''
# The next bit is to prevent the standard Formatter from writing
# a traceback
record.exc_info = None
return True # otherwise, the record doesn't get output

这应该与前面的示例具有相同的效果,因此您可以使用相同的格式字符串。

关于具有额外选项的 Python/Django 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23003928/

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