1. 程式人生 > >Python--logging模組總結

Python--logging模組總結

在實際開發中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 的流程圖更加清晰:流程圖如下:Djiang-loggin流程圖