【发布时间】:2011-10-13 05:08:26
【问题描述】:
我正在尝试通过日志记录模块将一些上下文信息添加到一些日志中。我需要能够查看日志中每一行旁边的 projectid,每天创建超过 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”值,例如。在创建记录器对象或使用某些中间件时,但我只是不知道该怎么做。有人有什么建议吗?
【问题讨论】:
-
我看到了你的评论。日志本身提供了许多向日志添加上下文信息的方法,例如
LoggingAdapter或extra关键字 arg 记录调用。但是,如果您想将上下文信息添加到您无法访问其来源(例如在 3rd 方库中)的日志调用中,那么我建议采用这种方法。
标签: python django logging filter django-1.3