Django中的日志詳解


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 purposes
  • INFO: General system information
  • WARNING: 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.本文參考:

[1] Django 2.0 Logging

[2] Python Logging HOWTO

[3] Python and Django Logging in Plain English

[4] django進階之日志功能

[5] Django 個人博客 - 日志器使用

[6] Loggingrecord

[7] 記錄python腳本的日志


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM