Python--logging模組總結
阿新 • • 發佈:2018-12-12
在實際開發中logging模組會經常使用,但是對於類似Django的日誌配置,之前自己一致都沒有好好整理,這次在這裡進行重新彙總整理。參考 Django官方文件 和 Python官方文件.
1. logging
文件說明
logging模組為應用程式提供了靈活的手段記錄事件、錯誤、警告和除錯資訊。對這些資訊可以進行收集、篩選、寫入檔案、傳送給系統日誌等操作,甚至還可以通過網路傳送給遠端計算機。
日誌記錄級別
logging模組的重點在於生成和處理日誌訊息。每條訊息由一些文字和指示其嚴重性的相關級別組成。級別包含符號名稱和數字值。
級別 | 值 | 描述 |
---|---|---|
CRITICAL | 50 | 關鍵錯誤/訊息 |
ERROR | 40 | 錯誤 |
WARNING | 30 | 警告訊息 |
INFO | 20 | 通知訊息 |
DEBUG | 10 | 除錯 |
NOTSET | 0 | 無級別 |
記錄器
記錄器負責管理日誌訊息的預設行為,包括日誌記錄級別、輸出目標位置、訊息格式以及其它基本細節。
關鍵字引數 | 描述 |
---|---|
filename | 將日誌訊息附加到指定檔名的檔案 |
filemode | 指定用於開啟檔案模式 |
format | 用於生成日誌訊息的格式字串 |
datefmt | 用於輸出日期和時間的格式字串 |
level | 設定記錄器的級別 |
stream | 提供開啟的檔案,用於把日誌訊息傳送到檔案。 |
format 日誌訊息格式
格式 | 描述 |
---|---|
%(name)s | 記錄器的名稱 |
%(levelno)s | 數字形式的日誌記錄級別 |
%(levelname)s | 日誌記錄級別的文字名稱 |
%(filename)s | 執行日誌記錄呼叫的原始檔的檔名稱 |
%(pathname)s | 執行日誌記錄呼叫的原始檔的路徑名稱 |
%(funcName)s | 執行日誌記錄呼叫的函式名稱 |
%(module)s | 執行日誌記錄呼叫的模組名稱 |
%(lineno)s | 執行日誌記錄呼叫的行號 |
%(created)s | 執行日誌記錄的時間 |
%(asctime)s | 日期和時間 |
%(msecs)s | 毫秒部分 |
%(thread)d | 執行緒ID |
%(threadName)s | 執行緒名稱 |
%(process)d | 程序ID |
%(message)s | 記錄的訊息 |
內建處理器
logging模組提供了一些處理器,可以通過各種方式處理日誌訊息。使用addHandler()方法將這些處理器新增給Logger物件。另外還可以為每個處理器配置它自己的篩選和級別。
- handlers.DatagramHandler(host,port):傳送日誌訊息給位於制定host和port上的UDP伺服器。
- handlers.FileHandler(filename):將日誌訊息寫入檔案filename。
- handlers.HTTPHandler(host, url):使用HTTP的GET或POST方法將日誌訊息上傳到一臺HTTP 伺服器。
- handlers.RotatingFileHandler(filename):將日誌訊息寫入檔案filename。如果檔案的大小超出maxBytes制定的值,那麼它將被備份為filename1。
2. Django
示例
2.1. setting.py
檔案配置
LOGGING = {
'version': 1, # 版本
'disable_existing_loggers': False,
# 輸出格式化:定義兩種'verbose'/'simple'選擇
'formatters': {
'verbose': {
# 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' # 官方示例
# WARNING 2018-11-08 16:19:23,113 views 24300 5424 文章分類修改'3'成功
'format': '%(asctime)s - %(filename)s\%(funcName)s[line:%(lineno)d] - %(levelname)s: %(message)s'
# 2018-11-08 16:34:17,512 - views.py\edit_news_category[line:329] - WARNING: 文章分類修改'時政熱點'成功
# 'format': '[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d %(module)s] %(message)s'
# [2018-11-08 16:22:29,817] WARNING [django.edit_news_category:329 views] 文章分類修改'4'成功
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
# 過濾器:定義兩種
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
# 處理器:定義三種
'handlers': {
'log_file': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'django_01.log',
'maxBytes': 16777216, # 16 MB
'formatter': 'verbose'
},
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['require_debug_false']
}
},
# 記錄器:
'loggers': {
'django': {
'handlers': ['console', 'log_file'],
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'myproject.custom': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['require_debug_false']
}
}
}
2. 2 view.py
檔案配置
import logging
logger = logging.getLogger('django') # 'django'與配置檔案中的logger名稱一致
logger.info('這是 loggging info message')
logger.debug('這是 loggging debug message')
logger.warning('這是 loggging a warning message')
logger.error('這是 an loggging error message')
logger.critical('這是 loggging critical message')
參考:https://www.cnblogs.com/gaoya666/p/8780723.html 的流程圖更加清晰:流程圖如下: