在日志格式化程序 Django 中添加动态自定义变量 Python

Add Dynamic custom variable in logging Formatter Django Python

让以下成为 settings.py`

中的日志格式化程序
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %thread)d %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'myproject.custom': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        }
    }
}

现在假设我有三个文件,即 A.py、B.py 和 C.py

在A.py我有一个装饰器

def myDecorator():
    #Code to generate unique Id for each request in Django APP
    uniqueId = #something

在B.py & C.py我有很多函数来处理各种请求

import A.py import myDecorator
import logging

@myDecorator
def func1():
    #Some Code
    logger.debug("Logger message")

@myDecorator
def func2():
    #Some Code
    logger.info("Logger message")

@myDecorator
def func3():
    #Some Code
    logger.debug("Logger message")

def func4():
    #May be Some functions without logger too !!!!
    logger.debug("Logger message")

现在我想将生成的唯一 ID 与记录器消息一起记录下来,而不是每次都在记录器中显式传递,我还想使其通用!

有什么方法可以将这些唯一 ID 传递给记录器而无需显式传递。

 'formatters': {
    'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s %(process)d 
            %thread)d %(message)s''%(unique_id)s'
    },
},

每当记录器被触发时,它应该从装饰器获取其相应的 ID 并将其记录在 %(unique_id)s 或者默认情况下它应该记录 None

这通常是通过定义自定义格式化程序并通过访问当前请求将您的数据(在您的情况下为 ID)注入日志格式。