2012-04-24 27 views
9

上午的Django 1.3,Python 2.6中Django的日誌 - django.request記錄器和額外的上下文

Django文檔這裏
https://docs.djangoproject.com/en/1.3/topics/logging/#django-request
它說,消息有以下額外的上下文:現狀和要求。
如何讓這些顯示在調試文件中?我想在我的日誌記錄配置是這樣的:

'formatters': {   
     'simple_debug': { 
      'format': '[%(asctime)s] %(levelname)s %(module)s %(message)s %(request.user)s',   
     } 
    }, 

但導致整體記錄失敗(即沒有記錄輸出發生)


編輯: 於是立即提交我的問題後,碰到這個: http://groups.google.com/group/django-users/browse_thread/thread/af682beb1e4af7f6/ace3338348e92a21

有人可以幫忙解釋/詳細說明

文檔中的所有引用的真正含義是,在使用django.request的django的 以內的所有地方,請求顯式爲 作爲額外的一部分傳入。

請求在哪裏顯式傳入,作爲額外的一部分?

回答

19

您不能在格式字符串中使用request.user,因爲%-formatting不處理該問題。你可以使用的格式字符串,如

'[%(asctime)s] %(levelname)s %(module)s %(message)s %(user)s' 

,並在你的日誌調用,使用類似

logger.debug('My message with %s', 'args', extra={'user': request.user}) 

extra字典合併到日誌事件記錄,其中有user屬性結束,然後通過格式字符串獲取,並出現在日誌中。

如果使用django.request記錄器,status_code和請求將在Django的extra字典中傳遞。如果你需要request.user,你可能需要添加一個logging.Filter這確實是這樣的:

class RequestUserFilter(logging.Filter): 
    def filter(self, record): 
     record.user = record.request.user 
     return True 

,這樣就可以顯示格式化輸出的用戶。

+0

啊!這完全有道理。謝謝。 – 2012-04-25 04:52:31

0

django-requestlogging middleware plugin可以方便地登錄請求相關的信息,而不調整所有記錄來電與extra參數添加request。這只是配置你的記錄器的問題。

以下各項可以使用Django-requestlogging時被記錄:

  • 用戶名
  • HTTP_USER_AGENT
  • PATH_INFO
  • remote_add
  • REQUEST_METHOD
  • SERVER_PROTOCOL