2015-03-31 245 views
0

我想在我的Django应用程序中使用python-logstash,并且需要传递'额外'字段。 Here are the docs自定义Python日志记录方法

extra = {"app":"app-live","source":"django_log"} 

我宁愿不经历,改变了我所有的记录器调用,例如:

logger.info('Information blah.')logger.info('Information blah.', extra=extra)

extra将是每一个呼叫,并且需要相同。我宁愿重写现有的记录器方法,以便我可以只做一次。

有没有办法在Django settings.py的日志记录处理程序中执行此操作,或者如何以及在哪里可以覆盖记录器方法以始终添加extra参数?

+0

使用一个正常的函数,你可以使用'functools.partial'来冻结一部分调用,但是如果记录器是一个类,那么这对于方法是行不通的。 – AChampion 2015-03-31 08:04:25

回答

0

您应该能够在logging cookbook中描述的全局范围内使用Filter

为了简化一下,Django提供了一个CallbackFilter。 你的过滤功能应该是这样的:

def logstash_filter(record): 
    record.app = 'app-live' 
    record.source = 'django_log' 
    return True 

而且你的日志记录配置是这样的。

... 
'filters': { 
    'add_logstash_info': { 
     '()': 'django.utils.log.CallbackFilter', 
     'callback': logstash_filter, 
    } 
}, 
'handlers': { 
    'logstash': { 
     ... 
     'filters': ['add_logstash_info'], 
    }, 
... 
+0

感谢@daniel,'log'数据没有出现在logstash中。我是否需要从过滤器中返回记录? – greenafrican 2015-03-31 12:20:04

+0

@ greenafrican这个例子有点泛泛,在你的情况下,过滤器应该应用到logstash处理程序。还请注意,我的过滤方法中缺少返回语句 – 2015-03-31 13:27:06