Django使用Python內建的logging模塊去建造本身的系統日誌的,若是你想詳細瞭解這個模塊的話,請本身去看python的說明文檔,這裏僅僅介紹Django中的日誌系統。html
日誌配置包括四個部分:格式器(formatters),過濾器(filters),處理器(handlers),記錄器(loggers),下面咱們來一一講解。python
控制日誌輸出的格式,格式使用python的字符串控制格式。sql
屬性 | 格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日誌產生的時間,默認格式爲2003-07-08 16:49:45,896 |
created | %(created)f | time.time()生成的日誌建立時間戳 |
filename | %(filename)s | 生成日誌的程序名 |
funcName | %(funcName)s | 調用日誌的函數名 |
levelname | %(levelname)s | 日誌級別 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
levelno | %(levelno)s | 日誌級別對應的數值 |
lineno | %(lineno)d | 日誌所針對的代碼行號(若是可用的話) |
module | %(module)s | 生成日誌的模塊名 |
msecs | %(msecs)d | 日誌生成時間的毫秒部分 |
message | %(message)s | 具體的日誌信息 |
name | %(name)s | 日誌調用者 |
pathname | %(pathname)s | 生成日誌的文件的完整路徑 |
process | %(process)d | 生成日誌的進程ID(若是可用) |
processName | %(processName)s | 進程名(若是可用) |
thread | %(thread)d | 生成日誌的線程ID(若是可用) |
threadName | %(threadName)s | 線程名(若是可用) |
過濾器是用來提供額外的控制,控制哪些日誌記錄能夠被傳給處理器處理。django
默認狀況下,只要日誌消息符合相應的等級要求就會傳給對應的處理器處理,然而,經過安裝過濾器,你能夠在日誌記錄過程當中設置額外的內容,例如,你能夠安裝一個過濾器使得某個源只有error級別的消息纔會被髮送。你也能夠使用過濾器修改以前會被髮送的消息,例如,你能夠寫一個過濾器使得符合某些條件的error等級的消息降級爲warning等級。網絡
過濾器能夠給處理器和記錄器使用,多個過濾器能夠級聯使用。框架
處理器是決定日誌記錄器中對應的實體消息發生了什麼的引擎,描述了一個具體的日誌行爲,好比輸出到屏幕,或者一個文件,抑或一個網絡socket。socket
和記錄器同樣,沒有到達相應等級的消息會被忽略。函數
一個記錄器能夠有多個處理器,一個處理器能夠有不一樣的日誌等級,所以你能夠根據消息的重要性而提供不一樣的提示。post
一個記錄器是日誌系統的一個實體,每個記錄器是一個已經命名好的能夠將消息爲進程寫入的"容器"。網站
每個記錄器都會有一個日誌等級,每一個等級描述了記錄器即將處理的信息的嚴重性,python定義瞭如下五個等級:
debug:出於調試目的的低層次系統信息
每一條被寫入記錄器的信息成爲一條日誌記錄,每條日誌記錄都有一個代表該記錄嚴重性的日誌等級,每條日誌信息也會包含一些有用的元信息代表已經被記錄的事件,好比棧追溯和錯誤代碼。
當一條信息被髮往記錄器的時候,消息的記錄等級會和記錄器的等級相比較,若是符合甚至超越當前等級,則被髮往處理器處理,不然會被忽略掉。
LOGGING = { 'version': 1, # 指明dictConnfig的版本,目前就只有一個版本 'disable_existing_loggers': False, # 禁用全部的已經存在的日誌配置 # 格式器 'formatters': { 'standard': { # 詳細 'format': '\n時間:[%(asctime)s] | 級別:[%(levelname)s] | 路徑:[%(pathname)s] | 文件名:[%(filename)s] | 方法:[%(funcName)s] | 行數:[%(lineno)d] | 日誌消息:\n[%(message)s]\n\n------------------------------------------------------------', }, 'simple': { # 簡單 'format': '時間:%(asctime)s | %(levelname)s | %(message)s', }, }, # 過濾器 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', # 此過濾器僅在settings.DEBUG爲True時傳遞記錄 }, 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', # 此過濾器僅在settings.DEBUG爲False時傳遞記錄 }, }, # 處理器,在這裏定義了三個處理器。主要指明:處理引擎類、格式器、過濾器、日誌等級 'handlers': { 'file_handler': { # 文件處理器,全部高於(包括)debug的消息會被傳到"E:/Djlog/file.log" 'level':'DEBUG', 'class':'logging.handlers.TimedRotatingFileHandler', 'formatter':'standard', 'filename': 'E:/Djlog/file.log', }, 'console':{ # 流處理器(控制檯),全部的高於(包括)debug的消息會被傳到stderr,使用的是simple格式器 'level':'INFO', 'class':'logging.StreamHandler', 'formatter': 'standard', }, 'mail_admins': { # AdminEmail處理器,全部高於(包括)而error的消息會被髮送給站點管理員,使用的是special格式器 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'formatter':'standard', 'include_html':False, # 是否發送那些回溯信息,由於這些都是很敏感的系統系統,若是被人截獲,可能會發生危險,因此要謹慎 'filters': ['require_debug_false'], # 當settings.DEBUG=False的時候,AdminEmailHandler才生效 }, }, # 記錄器。主要指明:處理器、日誌等級 'loggers': { 'django': { # 使用file_handler處理器,全部高於(包括)info的消息會被髮往console和file_handler處理器,向父層次傳遞信息 'handlers': ['file_handler','console'], 'level':'INFO', 'propagate': False, # 是否繼承父類的log信息 }, 'django.request': { # 全部高於(包括)error的消息會被髮往console和mail_admins處理器,消息不向父層次發送 'handlers': ['mail_admins','console'], 'level': 'DEBUG', 'propagate': False, }, 'myproject.custom': { # 全部高於(包括)info的消息同時會被髮往console和mail_admins處理器 'handlers': ['mail_admins','console'], 'level': 'INFO', 'propagate': False, }, } }
配置格式器,過濾器,處理器和記錄器後,須要將日誌記錄調用放入代碼中。使用日誌框架很是簡單,這是一個例子:
# import the logging library import logging # Get an instance of a logger logger = logging.getLogger(__name__) # 得到實例對象。__name__模塊名,能夠傳入其餘 def my_view(request, arg1, arg): ... if bad_mojo: # Log an error message logger.error('Something went wrong!')
LOGGING_CONFIG=None,禁用。
django記錄器是捕捉全部消息的記錄器,沒有消息是直接發往django記錄器的,而是使用下面的記錄器。
5XX會引起一個error消息,4XX會引起一個warning消息,這個記錄器還附帶有額外的上下文:
全部的由請求運行的sql語句都會記錄一條debug的消息,每一個記錄器還附帶有額外的上下文:
處於網站運行的表現緣由,僅當settings.DEBUG=True的時候,這個處理器才生效,不然即便配置了也無效。
這個過濾器接受一個回調函數(這個函數接受一個參數,被記錄的信息),每一個記錄經過過濾器的時候都會調用這個回調函數,當回調函數返回False的時候,不處理這個記錄。下面是一個示例:
from django.http import UnreadablePostError def skip_unreadable_post(record): if record.exc_info: exc_type, exc_value = record.exc_info[:2] if isinstance(exc_value, UnreadablePostError): return False return True
'filters': { 'skip_unreadable_posts': { '()': 'django.utils.log.CallbackFilter', 'callback': skip_unreadable_post, } }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['skip_unreadable_posts'], 'class': 'django.utils.log.AdminEmailHandler' } },
此過濾器僅在settings.DEBUG爲False時傳遞記錄。
此過濾器僅當settings.DEBUG爲True時傳遞記錄。
至此,轉載請註明出處。
[ 本站相關連接:>>Django部署 ]