1. 程式人生 > >Django的日誌系統

Django的日誌系統

日誌在程式開發中是少不了的,通過日誌我們可以分析到錯誤在什麼地方,有什麼異常。在生產環境下有很大的用途。在Java開發中通常用log4j,logback等第三方元件。那麼在django中是怎麼處理日誌?django利用的就是Python提供的logging模組,但django中要用logging,還得有一定的配置規則,需要在setting中設定。下面簡單介紹一下logging。

logging是現成安全的,其主要是由4部分組成:

  1. Logger                                                                                                                                                                                                                                                                                                                                                                                                    使用者使用的直接介面,將日誌傳遞給Handler
  2. Handler                                                                                                                                                                                                                                                                                                                                                                                            控制日誌輸出到哪裡,console,file… 

    一個logger可以有多個Handler

  3.Filter 

    控制哪些日誌可以從logger流向Handler

  4.Formatter 

    控制日誌的格式

一、logging模組

  logging模組為應用程式提供了靈活的手段記錄事件、錯誤、警告和除錯資訊。對這些資訊可以進行收集、篩選、寫入檔案、傳送給系統日誌等操作,甚至還可以通過網路傳送給遠端計算機。

1、日誌記錄級別

  logging模組的重點在於生成和處理日誌訊息。每條訊息由一些文字和指示其嚴重性的相關級別組成。級別包含符號名稱和數字值。

級別 描述
CRITICAL 50 關鍵錯誤/訊息
ERROR 40 錯誤
WARNING 30 警告訊息
INFO 20 通知訊息
DEBUG 10 除錯
NOTSET 0 無級別

 

 

 

 

 

 

2、記錄器

   記錄器負責管理日誌訊息的預設行為,包括日誌記錄級別、輸出目標位置、訊息格式以及其它基本細節。

關鍵字引數 描述
filename 將日誌訊息附加到指定檔名的檔案
filemode 指定用於開啟檔案模式
format 用於生成日誌訊息的格式字串
datefmt 用於輸出日期和時間的格式字串
level 設定記錄器的級別
stream 提供開啟的檔案,用於把日誌訊息傳送到檔案。

 

 

 

 

 

 

3、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 記錄的訊息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4、內建處理器

  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。

    由於內建處理器還有很多,如果想更深入瞭解。可以檢視官方手冊。

二、Django使用logging記錄日誌

 現在大概瞭解了logging的使用方法,現在可以結合django使用。

setting.py配置檔案

在最後面的加上logging的配置

BASE_LOG_DIR = os.path.join(BASE_DIR, "log")
LOGGING = {
    'version': 1,  # version表示版本,一般不用改
    # disable_existing_loggers表示棄用已經存在的日誌,True表示棄用,False表示不棄用。
    'disable_existing_loggers': False,  # 禁用已經存在的logger例項
    # 日誌檔案的格式
    'formatters': {
        # 詳細的日誌格式
        'verbose': {
            'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
                      '[%(levelname)s][%(message)s]'
        },
        # 標準的日誌格式
        'standard': {
            'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
        },
        # 簡單的日誌格式
        'simple': {
            'format': '[%(levelname)s][ %(message)s]'
        },

        # 定義一個特殊的日誌格式
        'collect': {
            'format': '%(message)s'
        }
    },
    # 上面的日誌格式可以自己隨便定義幾個
    # 過濾器
    'filters': {

    },
    # 處理器
    'handlers': {
        # 在終端列印
        'console': {
            'level': 'DEBUG',  # 日誌的級別
            'class': 'logging.StreamHandler',  #
            'formatter': 'simple'  # 使用哪種日誌格式
        },
        # 預設的
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 儲存到檔案,自動切
            'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"),  # 日誌檔案的位置
            'maxBytes': 1024 * 1024 * 50,  # 日誌大小 50M
            'backupCount': 3,  # 最多備份幾個
            'formatter': 'standard',  # 使用哪種日誌格式
            'encoding': 'utf-8',  # 儲存的格式
        },
        # 專門用來記錯誤日誌
        'error': {
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',  # 儲存到檔案,自動切
            'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"),  # 日誌檔案
            'maxBytes': 1024 * 1024 * 50,  # 日誌大小 50M
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        # 專門定義一個收集特定資訊的日誌
        'collect': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 儲存到檔案,自動切
            'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
            'maxBytes': 1024 * 1024 * 50,  # 日誌大小 50M
            'backupCount': 5,
            'formatter': 'collect',
            'encoding': "utf-8"
        }
    },
    # 上面的處理器可以根據自己的需求來配置
    'loggers': {
        # 預設的logger應用如下配置
        '': {
            'handlers': ['default', 'console', 'error'],  # 上線之後可以把'console'移除
            'level': 'DEBUG',
            'propagate': True,  # 向不向更高級別的logger傳遞
        },
        # 名為 'collect'的logger還單獨處理
        'collect': {
            'handlers': ['console', 'collect'],
            'level': 'INFO',
        }
    },
}
View Code

 

解析:

 1.formatters:配置列印日誌格式

 2.handler:用來定義具體處理日誌的方式,可以定義多種,"default"就是預設方式,"console"就是列印到控制檯方式。

 3.loggers:用來配置用那種handlers來處理日誌,比如你同時需要輸出日誌到檔案、控制檯。

 在views.py裡使用

import logging

# 生成一個以當前檔名為名字的logger例項
logger = logging.getLogger(__name__)
# 生成一個名為collect的logger例項
collect_logger = logging.getLogger("collect")


def index(request):
    logger.debug("這是一個除錯資訊1....")
    logger.info("這是一個資訊")
    logger.debug("這是一個除錯資訊2....")

    collect_logger.info("使用者:北京")

    return HttpResponse("OK")