django開發-log日誌的配置

wyzane發表於2019-02-16

在生產環境中,將程式的執行日誌輸出儲存到檔案中是很必要的操作;當應用崩潰時,很容易通過查詢日誌來定位問題。下面介紹一下django開發中如何將日誌輸出到檔案中。

首先看一下日誌級別有哪些:

DEBUG:所有等級中最低,其資訊一般用來作為除錯的輔助資訊
INFO:程式的一般資訊
WARNING:警告,通常用來對某些可能出現的錯誤且不會影響程式正常執行的資訊進行警告。
ERROR:錯誤,表示出現了某種錯誤。
CRITICAL:崩潰,出現了嚴重級別的錯誤。

在django專案中使用logging模組列印日誌的步驟如下:

1.匯入模組 import logging
2.設定日誌等級 logging.basicConfig(level=logging.DEBUG)
3.獲取logger物件 logger = logging.getLogger(__name__)
4.列印日誌 logger.debug("logger日誌"),還有logger.info(),logger.warning()等方法

下面介紹一下logging中的四個元件,如下:

1.Loggers
2.Handlers
3.Filters
4.Formatters

Loggers(日誌記錄器),系統中的每一條日誌都是由該元件進行記錄的,每一個記錄器都應該有其自己的名稱並標記其最低記錄的等級;當一條日誌給到logger時,logger會對該條資訊的級別與自身的級別進行比較,如果該日誌級別不低於本身級別,logger就會進行下一步操作。如果日誌的資訊級別比logger的低,那麼就會忽略這條日誌。
當logger經過級別的比較之後決定要對某條日誌進行處理時,就將該條日誌交給了Handlers

Handlers(處理器),用來處理具體每條資訊,例如是將日誌列印到螢幕還是記錄到檔案或者傳送至某個網路連線;它自己的記錄級別,如果日誌級別低於handler的級別,handler同樣會忽略掉該條日誌。

Filter(過濾器):提供了傳遞給handler之前的附加功能。在通常情況下,一條日誌資訊只要達到logger的級別之後就會傳遞給handler處理,但是我們可以通過使用filter來對日誌進行額外的過濾。
例如我們可以使用某個filter來控制只允許某個特定的源的ERROR級別的日誌。
Filter還執行我們們在處理之前修改日誌,例如降低或者提高日誌的級別。
Filter可以在logger和handler中同時使用,而且多個filter會同時工作。

Formatter(格式化):定義了怎麼顯示內容,因為最終的日誌都會是以文字的形式展現,formatter就是描述怎麼來做這件事。formatter通常都是使用python格式化字串的方法來對日誌進行格式化

最後看一個日誌配置的例子:

logger.py:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BASE_LOG_DIR = os.path.join(BASE_DIR, "logs")


LOGGING = {
    `version`: 1,  # 保留的引數,預設是1
    `disable_existing_loggers`: False,  # 是否禁用已經存在的logger例項
    # 日誌輸出格式的定義
    `formatters`: {
        `standard`: {  # 標準的日誌格式化
            `format`: `%(levelname)s %(asctime)s %(module)s %(message)s`
        },
        `error`: {     # 錯誤日誌輸出格式
            `format`: `%(levelname)s %(asctime)s %(pathname)s %(module)s %(message)s`
        },
        `simple`: {
            `format`: `%(levelname)s %(asctime)s %(message)s`
        },
        `collect`: {
            `format`: `%(message)s`
        }
    },
    # 處理器:需要處理什麼級別的日誌及如何處理
    `handlers`: {
        # 將日誌列印到終端
        `console`: {
            `level`: `DEBUG`,                  # 日誌級別
            `class`: `logging.StreamHandler`,  # 使用什麼類去處理日誌流
            `formatter`: `simple`              # 指定上面定義過的一種日誌輸出格式
        },
        # 預設日誌處理器
        `default`: {
            `level`: `DEBUG`,
            `class`: `logging.handlers.RotatingFileHandler`,  # 儲存到檔案,自動切
            `filename`: os.path.join(BASE_LOG_DIR, "xx.log"),  # 日誌檔案路徑
            `maxBytes`: 1024 * 1024 * 100,  # 日誌大小 100M
            `backupCount`: 5,  # 日誌檔案備份的數量
            `formatter`: `standard`,  # 日誌輸出格式
            `encoding`: `utf-8`,
        },
        # 日誌處理級別warn
        `warn`: {
            `level`: `WARN`,
            `class`: `logging.handlers.RotatingFileHandler`,  # 儲存到檔案,自動切
            `filename`: os.path.join(BASE_LOG_DIR, "warn.log"),  # 日誌檔案路徑
            `maxBytes`: 1024 * 1024 * 100,  # 日誌大小 100M
            `backupCount`: 5,  # 日誌檔案備份的數量
            `formatter`: `standard`,  # 日誌格式
            `encoding`: `utf-8`,
        },
        # 日誌級別error
        `error`: {
            `level`: `ERROR`,
            `class`: `logging.handlers.RotatingFileHandler`,  # 儲存到檔案,自動切
            `filename`: os.path.join(BASE_LOG_DIR, "error.log"),  # 日誌檔案路徑
            `maxBytes`: 1024 * 1024 * 100,  # 日誌大小 100M
            `backupCount`: 5,
            `formatter`: `error`,  # 日誌格式
            `encoding`: `utf-8`,
        },
    },

    `loggers`: {
        # 預設的logger應用如下配置
        ``: {
            `handlers`: [`default`, `warn`, `error`],
            `level`: `DEBUG`,
            `propagate`: True,  # 如果有父級的logger示例,表示不要向上傳遞日誌流
        },
        `collect`: {
            `handlers`: [`console`, `default`, `warn`, `error`],
            `level`: `INFO`,
        }
    },
}

在settings.py中匯入logger.py中的配置即可:

from logger.py import LOGGING

以上就是log日誌配置的介紹,歡迎交流!

相關文章