Django 系統日志logging


Django使用Python內建的logging模塊去建造自己的系統日志的,如果你想詳細了解這個模塊的話,請自己去看python的說明文檔,這里僅僅介紹Django中的日志系統。

日志配置包括四個部分:格式器(formatters),過濾器(filters),處理器(handlers),記錄器(loggers),下面我們來一一講解。

格式器

控制日志輸出的格式,格式使用python的字符串控制格式。

屬性 格式 描述
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 線程名(如果可用)

過濾器

過濾器是用來提供額外的控制,控制哪些日志記錄可以被傳給處理器處理。

默認情況下,只要日志消息符合相應的等級要求就會傳給對應的處理器處理,然而,通過安裝過濾器,你可以在日志記錄過程中設置額外的內容,例如,你可以安裝一個過濾器使得某個源只有error級別的消息才會被發送。你也可以使用過濾器修改之前會被發送的消息,例如,你可以寫一個過濾器使得符合某些條件的error等級的消息降級為warning等級。

過濾器可以給處理器和記錄器使用,多個過濾器可以級聯使用。

處理器

處理器是決定日志記錄器中對應的實體消息發生了什么的引擎,描述了一個具體的日志行為,比如輸出到屏幕,或者一個文件,抑或一個網絡socket。

和記錄器一樣,沒有到達相應等級的消息會被忽略。

一個記錄器可以有多個處理器,一個處理器可以有不同的日志等級,因此你可以根據消息的重要性而提供不同的提示。

記錄器

一個記錄器是日志系統的一個實體,每一個記錄器是一個已經命名好的可以將消息為進程寫入的"容器"。

每一個記錄器都會有一個日志等級,每個等級描述了記錄器即將處理的信息的嚴重性,python定義了以下五個等級:

debug:出於調試目的的低層次系統信息

  • info:普通的系統信息
  • warning:描述已經發生的小問題
  • error:描述已經發生的主要問題
  • critical:描述已經發生的嚴重問題

每一條被寫入記錄器的信息成為一條日志記錄,每條日志記錄都有一個表明該記錄嚴重性的日志等級,每條日志信息也會包含一些有用的元信息表明已經被記錄的事件,比如棧追溯和錯誤代碼。

當一條信息被發往記錄器的時候,消息的記錄等級會和記錄器的等級相比較,如果符合甚至超越當前等級,則被發往處理器處理,否則會被忽略掉。

使用日志

在settings.py中配置

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記錄器

django記錄器是捕捉所有消息的記錄器,沒有消息是直接發往django記錄器的,而是使用下面的記錄器。

django.request記錄器

5XX會引發一個error消息,4XX會引發一個warning消息,這個記錄器還附帶有額外的上下文:

  • status_code:HTTP響應嗎
  • request:生成這個消息的request對象

django.db.backends記錄器

所有的由請求運行的sql語句都會記錄一條debug的消息,每個記錄器還附帶有額外的上下文:

  • duration:sql語句運行的時間
  • sql:運行的sql語句
  • params:sql語句調用的參數

處於網站運行的表現原因,僅當settings.DEBUG=True的時候,這個處理器才生效,否則即使配置了也無效。

Django自帶的過濾器

class CallBackFilter(callback)

這個過濾器接受一個回調函數(這個函數接受一個參數,被記錄的信息),每個記錄通過過濾器的時候都會調用這個回調函數,當回調函數返回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'
    }
},

class RequireDebugFalse

此過濾器僅在settings.DEBUG為False時傳遞記錄。

class RequireDebugTrue

此過濾器僅當settings.DEBUG為True時傳遞記錄。

 

  至此,轉載請注明出處。

本站相關鏈接:>>Django部署 ]


免責聲明!

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



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