1.日志
1.1 日志的作用
簡單總結為以下3點:
- 用於程序調試
- 了解軟件程序運行情況,是否正常
- 軟件程序運行故障分析與問題定位
1.2 日志的等級
不同的應用程序所定義的日志等級可能會有所差別,分的詳細點的會包含以下幾個等級:
-
DEBUG
-
INFO
-
NOTICE
-
WARNING
-
ERROR
-
CRITICAL
-
ALERT
-
EMERGENCY
1.3 日志信息與格式
一條日志信息對應的是一個事件的發生,而一個事件通常需要包括以下幾個內容:
- 事件發生時間
- 事件發生位置
- 事件的嚴重程度--日志級別
- 事件內容
2.Django中的日志
2.1 日志器 Logger
日志器提供應用程序代碼直接使用的接口,是整個日志系統的入口。
一個日志器設定了日志級別,只有達到這個日志級別的信息才會被日志器處理,在這個日志級別以下的信息將會被日志器忽略。當日志器處理一條達到級別的信息時,它將會把這個信息傳給處理器。
Python中定義了五個日志級別(從低到高):
DEBUG
: Low level system information for debugging purposesINFO
: General system informationWARNING
: Information describing a minor problem that has occurred.ERROR
: Information describing a major problem that has occurred.CRITICAL
: Information describing a critical problem that has occurred.
2.2 處理器 Handler
處理器是日志處理的引擎,用於將日志記錄發送到指定的目的位置。它決定了要將怎樣的日志行為信息寫入到哪里,如控制台、文件或socket端口。
同日志器一樣,處理器也有日志級別,也只會處理達到設定的日志級別的信息。一個日志器可以有多個處理器,每個處理器都設定有一個日志級別。你可以給每個處理器設定不同的日志級別。
2.3 過濾器 Filter
過濾器作為日志器和處理器之間額外的控制,用於控制哪些信息應該從日志器傳送到處理器。
系統默認任何達到日志級別要求的日志都會被處理,但通過增加過濾器,你可以在日志記錄過程中增加額外的標准要求,以決定自己想要的日志級別。
過濾器可以被增加在日志器中或者處理器中,同時也可以增加多個過濾器形成多個過濾操作。
2.4 格式器 Formatter
一個日志記錄最終需要被記錄為文本,格式器用於決定這個文本的格式。一個格式器通常由包含了LogRecord attributes的Python自帶的格式化字符串組成。當然,我們也可以自定義特定的格式。
常用的LogRecord Attributes有:
Attribute name | Format | Description |
---|---|---|
asctime | %(asctime)s |
Human-readable time when the LogRecord was created. 默認格式為:2003-07-08 16:49:45,896. |
filename | %(filename)s |
Filename portion of pathname . |
levelname | %(levelname)s |
Text logging level for the message ('DEBUG' , 'INFO' , 'WARNING' , 'ERROR' , 'CRITICAL' ). |
levelno | %(levelno)s |
Numeric logging level for the message (DEBUG , INFO , WARNING , ERROR , CRITICAL ). |
lineno | %(lineno)d |
Source line number where the logging call was issued (if available). |
message | %(message)s |
The logged message, computed as msg % args . This is set when Formatter.format() is invoked. |
module | %(module)s |
Module (name portion of filename ). |
pathname | %(pathname)s |
Full pathname of the source file where the logging call was issued (if available). |
process | %(process)d |
Process ID (if available). |
processName | %processName)s |
Process name (if available). |
thread | %(thread)d |
Thread ID (if available). |
threadName | %(threadName)s |
Thread name (if available). |
2.5 日志的工作流程圖
3.日志的使用范例
在setting中增加日志配置,LOGGING字典中對日志器、處理器、過濾器、格式器進行配置
# 日志配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用日志器
# 日志格式
'formatters': {
# 詳細格式,名字可隨意取
'verbose': {
# 格式: 報錯等級 報錯時間 模塊 行號 信息
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
# 簡單格式
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
# 過濾器
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue', # 過濾掉調試信息
},
},
# 處理錯誤信息的對象
'handlers': {
'console': { # 處理錯誤信息的控制台對象,即我們在pycharm中看到的調試信息由此控制
'level': 'DEBUG', # DEBUG以上級別報錯信息都會出現在控制台
'filters': ['require_debug_true'], # 設定過濾器
'class': 'logging.StreamHandler', # 日志處理器
'formatter': 'verbose' # 日志格式設為詳細格式
},
'file': { # 處理錯誤信息的file對象
'level': 'INFO', # 記錄INFO級別以上的報錯信息
'class': 'logging.handlers.RotatingFileHandler', # 日志處理器
'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/luffy.log"), # 日志位置,日志文件名,日志保存目錄logs必須手動創建,一般創建在項目根目錄下
'maxBytes': 300 * 1024 * 1024, # 日志文件的最大值,這里我們設置300M
'backupCount': 10, # 日志文件的數量,設置最大日志數量為10
'formatter': 'verbose' # 日志格式:詳細格式,日志格式在上面定義了
},
},
# 日志對象
'loggers': {
# 日志器名
'django': {
'handlers': ['console', 'file'], # 處理對象有兩個,一個conosle對象,一個file對象,這兩個對象在上面的handlers中進行了定義和配置
'propagate': True, # 是否讓日志信息繼續冒泡給其他的日志處理系統,子級向父級傳播
},
}
}
在視圖函數中使用日志器
import logging
logging = logging.getLogger('django')
項目運行后,將可以看到達到INFO
級別的日志信息被記錄在logs目錄中的luffy.log文件中
4.本文參考:
[3] Python and Django Logging in Plain English
[4] django進階之日志功能
[6] Loggingrecord
[7] 記錄python腳本的日志