python - 在 django 1.3 中将动态元素添加到logging.filters

标签 python django logging filter django-1.3

我正在尝试通过日志记录模块向某些日志添加一些上下文信息。我需要能够查看日志中每一行旁边的项目 ID,每天创建超过 20,000 个项目,此数据非常有用。为此,我创建了logging.Filter 模块的衍生版本。

import logging

class MTFilter(logging.Filter):

def __init__(self, projectid=0):
    self.projectid = projectid

def filter(self, record):
    record.projectid = self.projectid
    return True

这是我在 settings.py 中的 LOGGING 变量

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'filters': {
        'project': {
            '()':  'app.proj.logging.mtfilter.MTFilter',
        },  
    },
    'formatters': { 
        'projectformat': {
            'format': '%(asctime)s %(levelname)8s PID[%(projectid)d] %(name)s[%(funcName)s]: %(message)s',
        },
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'django.utils.log.NullHandler',
        },
        'project-log': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'projectformat',
            'filename': os.path.join(SITE_ROOT, '../logs/django.log'),
            'filters':  ['project'],
            'maxBytes': 1024*1024*16, #16Mb
        },
    },
    'loggers': {
        '': {
            'handlers':     ['null'],
            'level':        'DEBUG',
            'propagate':    True,
        },
        'proj': {
             'handlers':    ['project-log'],
             'level':       'DEBUG',
         },
    }
}

在我看来,我使用以下内容

logger = logging.getLogger('proj')
logger.info('Log Message')

通过不在 Logging.filters.project 中为“projectid”添加任何值,我得到默认格式值“0”。日志结果如下所示:

2011-07-26 02:41:44,488     INFO PID[0] proj[view]: Log Message

我想做的是以某种方式动态获取“projectid”值,例如。创建记录器对象或使用某些中间件时,但我只是不知道该怎么做。有人有建议吗?

最佳答案

What I'd like to do is grab the 'projectid' value dynamically somehow, eg. when creating a logger object, or using some Middleware but I just don't know how to do it.

创建记录器时不适合执行此操作,因为这是一次性操作。您可能需要做的是找到某种方法将当前项目 ID 放入过滤器中。例如,您可以使用带有可调用函数的设计,过滤器调用该函数来获取项目 ID,而不是在构造时将记录传递到过滤器中。例如:

class ProjectFilter(logging.Filter):
    def __init__(self, func):
        self.func = func

    def filter(self, record):
        record.projectid = self.func()
        return True

可调用对象可以是任何知道如何从当前上下文获取项目 ID 的东西(例如线程局部变量 - 尽管这没有得到 Django 核心团队的认可,但这正是线程局部变量的发明目的,并且被其他线程非常成功地使用) Flask 等框架)。我对您的应用程序了解不够,无法建议可调用程序如何工作。

关于python - 在 django 1.3 中将动态元素添加到logging.filters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6827078/

相关文章:

python - 需要处理目录中的所有文件,但我只得到一个

python - 确定 CustomLinearOperator 的转置

python - django如何获取 View 中的小数总和?

python - 无法分配必须是一个实例。 Django

java - Log4j2 - Asynclogger Rolling File Appender 不是每天每小时滚动一次

c# - 向 MySQL 数据库写入异常时出现 Log4Net 异常

google-chrome - Chrome 开发工具控制台 : see toString representation of an object?

Python Selenium 返回 HTML 位置

python - 在Python中将日期转换为自然语言?

python - 将数据帧列分解为多行(TypeError : Cannot cast array data from dtype ('int64' ) to dtype ('int32' ))