1. 程式人生 > >Django 日誌

Django 日誌

當前 失敗 blog 普通 rop spa lte stream 數據

Django使用Python內置的logging模塊實現它自己的日誌系統。

如果你沒有使用過logging模塊,請參考Python教程中的相關章節。

直達鏈接《logging模塊詳解》。

在Python的logging模塊中,主要包含下面四大金剛:

  • Loggers: 記錄器
  • Handlers:處理器
  • Filters: 過濾器
  • Formatters: 格式化器

下文假定你已經對logging模塊有一定的了解。否則,可能真的像看天書......

一、在Django視圖中使用logging

使用方法非常簡單,如下例所示:

# 導入logging庫
import logging

# 獲取一個logger對象
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # 記錄一個錯誤日誌
        logger.error(‘Something went wrong!‘)

每滿足bad_mojo條件一次,就寫入一條錯誤日誌。

實際上,logger對象有下面幾個常用內置方法:

  • logger.debug()
  • logger.info()
  • logger.warning()
  • logger.error()
  • logger.critical()

二、在Django中配置logging

通常,只是像上面的例子那樣簡單的使用logging模塊是遠遠不夠的,我們一般都要對logging的四大金剛進行一定的配置。

Python的logging模塊提供了好幾種配置方式。默認情況下,Django使用dictConfig format。也就是字典方式。

例一:

LOGGING = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: False,
    ‘handlers‘: {
        ‘file‘: {
            ‘level‘: ‘DEBUG‘,
            ‘class‘: ‘logging.FileHandler‘,
            ‘filename‘: ‘/path/to/django/debug.log‘,
        },
    },
    ‘loggers‘: {
        ‘django‘: {
            ‘handlers‘: [‘file‘],
            ‘level‘: ‘DEBUG‘,
            ‘propagate‘: True,
        },
    },
}

如果你使用上面的樣例,請確保Django用戶對‘filename‘對應目錄和文件的寫入權限。

例二:

下面這個示例配置,讓Django將日誌打印到控制臺,通常用做開發期間的信息展示。

import os

LOGGING = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: False,
    ‘handlers‘: {
        ‘console‘: {
            ‘class‘: ‘logging.StreamHandler‘,
        },
    },
    ‘loggers‘: {
        ‘django‘: {
            ‘handlers‘: [‘console‘],
            ‘level‘: os.getenv(‘DJANGO_LOG_LEVEL‘, ‘INFO‘),
        },
    },
}

例三:

下面是一個相當復雜的logging配置:

LOGGING = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: False,
    ‘formatters‘: {
        ‘verbose‘: {
            ‘format‘: ‘%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s‘
        },
        ‘simple‘: {
            ‘format‘: ‘%(levelname)s %(message)s‘
        },
    },
    ‘filters‘: {
        ‘special‘: {
            ‘()‘: ‘project.logging.SpecialFilter‘,
            ‘foo‘: ‘bar‘,
        },
        ‘require_debug_true‘: {
            ‘()‘: ‘django.utils.log.RequireDebugTrue‘,
        },
    },
    ‘handlers‘: {
        ‘console‘: {
            ‘level‘: ‘INFO‘,
            ‘filters‘: [‘require_debug_true‘],
            ‘class‘: ‘logging.StreamHandler‘,
            ‘formatter‘: ‘simple‘
        },
        ‘mail_admins‘: {
            ‘level‘: ‘ERROR‘,
            ‘class‘: ‘django.utils.log.AdminEmailHandler‘,
            ‘filters‘: [‘special‘]
        }
    },
    ‘loggers‘: {
        ‘django‘: {
            ‘handlers‘: [‘console‘],
            ‘propagate‘: True,
        },
        ‘django.request‘: {
            ‘handlers‘: [‘mail_admins‘],
            ‘level‘: ‘ERROR‘,
            ‘propagate‘: False,
        },
        ‘myproject.custom‘: {
            ‘handlers‘: [‘console‘, ‘mail_admins‘],
            ‘level‘: ‘INFO‘,
            ‘filters‘: [‘special‘]
        }
    }
}

上面的logging配置主要定義了這麽幾件事情:

  • 定義了配置文件的版本,當前版本號為1.0

  • 定義了兩個formatter:simple和format,分別表示兩種文本格式。

  • 定義了兩個過濾器:SpecialFilter和RequireDebugTrue

  • 定義了兩個處理器:console和mail_admins
  • 配置了三個logger:‘django‘、‘django.request‘和‘myproject.custom‘

三、Django對logging模塊的擴展

Django對logging模塊進行了一定的擴展,用來滿足Web服務器專門的日誌記錄需求。

1. 記錄器 Loggers

Django額外提供了幾個其內建的logger。

  • django: 不要使用這個記錄器,用下面的。這是一個被供起來的記錄器,^-^
  • django.request: 記錄與處理請求相關的消息。5XX錯誤被記錄為ERROR消息;4XX錯誤記錄為WARNING消息。接收額外參數:status_code和request
  • django.server: 記錄開發服務器下處理請求相關的消息。只用於開發階段。
  • django.template: 記錄與渲染模板相關的日誌。
  • django.db.backends: 與數據庫交互的代碼相關的消息。
  • django.security: 記錄任何與安全相關的錯誤。
  • django.security.csrf: 記錄CSRF驗證失敗日誌。
  • django.db.backends.schema: 記錄查詢導致數據庫修改的日誌。

2. 處理器 Handlers

Django額外提供了一個handler,AdminEmailHandler。這個處理器將它收到的每個日誌信息用郵件發送給站點管理員。

3. 過濾器Filters

Django還額外提供兩個過濾器。

  • CallbackFilter(callback)[source]:這個過濾器接受一個回調函數,並對每個傳遞給過濾器的記錄調用它。如果回調函數返回False,將不會進行記錄的處理。

  • RequireDebugFalse[source]: 這個過濾器只會在settings.DEBUG==False時傳遞。

四、總結

總體而言,在Django中使用logging和在普通Python程序中,區別不大。

Django 日誌