2011-03-25 172 views
84

我似乎無法弄清楚如何爲我的Django安裝設置「默認」記錄器。我想在settings.py中使用Django 1.3的新LOGGING設置。Django設置默認日誌

我已經看了Django Logging Doc's example,但它看起來像我只是設置處理程序,將執行特定的記錄器日誌記錄。在他們的例子中,他們爲名爲'django','django.request'和'myproject.custom'的記錄器設置處理程序。

我想要做的就是設置一個默認的logging.handlers.RotatingFileHandler,它將默認處理所有的記錄器。也就是說,如果我在項目中的某個地方創建了一個新模塊,並且它被表示爲:my_app_name.my_new_module,我應該可以做到這一點,並讓所有日誌記錄都轉到了旋轉文件日誌中。

# In file './my_app_name/my_new_module.py' 
import logging 
logger = logging.getLogger('my_app_name.my_new_module') 
logger.debug('Hello logs!') # <-- This should get logged to my RotatingFileHandler that I setup in `settings.py`! 

回答

132

想通了......

您用空字符串引用它設置「所有」記錄:''

作爲一個例子,在下面的設置中,我將所有的日誌事件保存到logs/mylog.log,除了django.request日誌事件將被保存到logs/django_request.log。因爲'propagate'對於我的django.request記錄器設置爲False,日誌事件永遠不會到達「全部捕獲」記錄器。

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s' 
     }, 
    }, 
    'handlers': { 
     'default': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/mylog.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
     'request_handler': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/django_request.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
    }, 
    'loggers': { 
     '': { 
      'handlers': ['default'], 
      'level': 'DEBUG', 
      'propagate': True 
     }, 
     'django.request': { 
      'handlers': ['request_handler'], 
      'level': 'DEBUG', 
      'propagate': False 
     }, 
    } 
} 
+2

克里斯,這個Django文檔不混亂。謝謝你。 – 2011-07-18 11:43:06

+4

微小的更正:評論意味着sql記錄會受到django.request記錄器的影響。要重定向sql日誌記錄,你需要爲'django.db'定義一個記錄器。 django.request記錄器處理5xx&4xx http響應。 – rych 2011-09-27 22:56:05

+0

@rych感謝您的更正,它爲我節省了一些時間! – 18bytes 2012-03-23 12:39:29

17

正如你在your answer說,克里斯,一個選項來定義默認記錄器是使用空字符串作爲它的鍵。

但是,我認爲預期的方法是在日誌配置字典的root鍵下定義一個特殊的日誌記錄器。我發現這個在Python documentation

- 這將是根記錄器的配置。配置的處理將與任何記錄器相同,但propagate設置將不適用。

下面是從你的答案的配置更改爲使用root鍵:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s' 
     }, 
    }, 
    'handlers': { 
     'default': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/mylog.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
     'request_handler': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/django_request.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
    }, 
    'root': { 
     'handlers': ['default'], 
     'level': 'DEBUG' 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['request_handler'], 
      'level': 'DEBUG', 
      'propagate': False 
     }, 
    } 
} 

爲了公平起見,我看不出在兩種配置之間的行爲有什麼區別。看來用空字符串鍵定義記錄器會修改根記錄器,因爲logging.getLogger('')將返回根記錄器。

我更喜歡'root'而不是''的唯一原因在於它明確的修改根記錄器。如果你很好奇,'root'將覆蓋'',如果你定義了兩者,僅僅是因爲最後處理了根條目。

+0

是的,沒錯,抱歉錯誤糾正!雖然使用''而不是'root'有點合乎邏輯,但我仍然發現它們在從2.6 fileConfig邏輯平滑過渡到2.7 dictConfig的過程中將'root'條目移入字典根目錄時有點不一致。 – 2014-09-18 06:39:03

0
import logging 
logger = logging.getLogger(__name__) 
添加後

logging.basicConfig(
    level = logging.DEBUG, 
    format = '%(name)s %(levelname)s %(message)s', 
) 

,我們可能會改變格式:

format = '"%(levelname)s:%(name)s:%(message)s" ', 

format = '%(name)s %(asctime)s %(levelname)s %(message)s',