2015-03-31 162 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