Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志:如何向LogRecord添加自定义字段,并注册一个全局回调来设置它';s值_Python_Flask - Fatal编程技术网

Python日志:如何向LogRecord添加自定义字段,并注册一个全局回调来设置它';s值

Python日志:如何向LogRecord添加自定义字段,并注册一个全局回调来设置它';s值,python,flask,Python,Flask,在Flask应用程序中,我想在生成的每个错误日志记录中添加一个user\u id字段,只要Flask.session中存在user\u id 我提出了下面的解决方案,但它很粗糙,因为它不允许格式字符串驱动用户id的格式,而且日志API似乎提供了定制日志的方法(LoggerAdapter,logging.makeRecord,等等),我认为必须有一种更干净的方法 “python方式”是什么 class CustomFormatter(Formatter): def format(self,

在Flask应用程序中,我想在生成的每个错误日志记录中添加一个
user\u id
字段,只要
Flask.session中存在
user\u id

我提出了下面的解决方案,但它很粗糙,因为它不允许格式字符串驱动
用户id
的格式,而且日志API似乎提供了定制日志的方法(
LoggerAdapter
logging.makeRecord
,等等),我认为必须有一种更干净的方法

“python方式”是什么

class CustomFormatter(Formatter):
    def format(self, record):
        from myapp.core import authenticationManager
        user_id = authenticationManager.current_user_id_if_authenticated()
        user_id = "unknown" if user_id is None else str(user_id)
        return super(F,self).format(record) + ", user_id" + user_id
您可以定义哪个为
记录.user\u id
注入值。通过这种方式,您可以定义一种格式,该格式与其他(标准)记录属性一样,包含
%(用户id)

format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s')
然后,所有日志调用将自动添加
用户id


()包执行以下操作:

使用:

import logaugment

logaugment.set(logger, user_id='custom_value')
使用
logger
的所有日志调用现在将在日志消息中为
%(用户id)s
使用值
'custom\u value'

您可以重复调用
logaugment.set
,而无需更改值。或者,您可以指定每次进行日志记录调用时都将调用的callable。这将允许动态计算/检索用户ID(参见包自述中的示例)

要安装:

pip install logaugment

(免责声明:我开发了这个软件包)

谢谢,它工作得很好,但是应该返回1而不是True,正如文档规定的那样:?任何在布尔上下文中计算为True的对象都可以,“将此记录器的筛选器应用于记录,如果要处理记录,则返回真值”。我更喜欢
True
而不是
1
,因为它强调我们使用的是对象的“布尔性”。太好了。在您的示例中,记录器的所有子记录器是否可以在其日志调用中使用
custom_value
pip install logaugment