2012-06-21 34 views
5

我想通過我的settings.py文件向我的日誌行添加一個變量。Django:將變量傳遞給登錄設置文件

這是在設置中的代碼(記錄部分):

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'mail_admins': { 
         'level': 'CRITICAL', 
         'class': 'django.utils.log.AdminEmailHandler' 
         }, 

     'customhandler':{ 
         'level':'DEBUG', 
         'class':'logging.RotatingFileHandler', 
         'formatter':'custom_format', 
         'filename':LOG_LOCATION 
         }, 
       }, 

    'loggers': { 
     'django.request': { 
         'handlers': ['mail_admins'], 
         'level': 'CRITICAL', 
         'propagate': True, 
          }, 
     'Logger_Custom1': { 
         'handlers':['customhandler'], 
         'level':'DEBUG', 
         'propagate':True 
          }, 
       }, 

    'formatters': { 
     'verbose': { 
      'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 
        }, 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
        }, 
     'custom_format':{ 
      'format':'[%(asctime)s %(levelname)s T:%(threadName)s F:%(funcName)s ] %(message)s ' 
         }, 
       } 
} 

上面的代碼工作正常,但現在我想每個日誌消息以具有在端部的變量。像這樣的:

MyVariable = "Somelines" 
[%(asctime)s %(levelname)s T:%(threadName)s F:%(funcName)s ] %(message)s 'MyVariable 

所以我的日誌將有每個日誌行結束時該變量的內容。我知道我們可以在視圖函數內部這樣做:logging.warning('% before you %','Look','Leap')但是這需要我們在任何地方單獨包含該行。此外,當我們需要添加或更改該變量名稱時,我們需要在每個文件的任何位置更改該行。

所以我想知道是否有任何方法直接從settings.py中做到這一點,以便我們可以做出一個更改,它將適用於所有日誌消息。

回答

3

我自己找到了解決方案。我不知道這是否是一種好的做法,但它有效。

我所做的只是分配一個變量:

testvar = "MyVariable" 

然後追加這個變量,像這樣:

'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s ' + testvar 

輸出將有變量的日誌條目合併日誌格式。 謝謝。請讓我知道是否有更多的方法來做到這一點。

+0

我,可以證明在你的實際代碼有幫助,以及(只是'%(消息)s'之後)添加在格式字符串末尾的空間!這樣,Django日誌消息和自定義消息之間就會有一個空格。 另外請注意,只有'testvar'是一個字符串,這纔會起作用!你可以通過用字符串函數,即'str(testvar)'來包裝它,使它更健壯一些。 – Hannele

+0

嘿,這是一個很棒的提示......謝謝...... –

1

您所指的日誌格式字符串有許多日誌記錄模塊提供的變量。完整列表​​。實質上,它將字典傳遞到字符串進行格式化 - 而且您無法操作該列表。相反,你應該直接在格式字符串中「硬編碼」你的變量,因爲它是實際值,或者將值存儲在你的設置文件中的一個變量中,然後將其附加。

'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s and look, custom stuff here!!!' 

或..

custom = 'and look, custom stuff here!!!' 
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s ' + custom