Django之logging日誌使用
Logger模組
是python中用於便捷記錄日誌且執行緒安全的模組
使用logging模組記錄日誌涉及四個主要類:
logger提供了應用程式可以直接使用的介面;
handler將(logger建立的)日誌記錄傳送到合適的目的輸出;
filter提供了細度裝置來決定輸出哪條日誌記錄;
formatter決定日誌記錄的最終輸出格式
1.具體介紹:
logger
每個程式在輸出資訊之前都要獲得一個Logger。Logger通常對應了程式的模組名。
比如聊天工具的圖形介面模組可以這樣獲得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而核心模組可以這樣:
LOG=logging.getLogger(”chat.kernel”)
Logger.setLevel(lel):指定最低的日誌級別,低於lel的級別將被忽略。debug是最低的內建級別,critical為最高
Logger.addFilter(filt)、Logger.removeFilter(filt):新增或刪除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或刪除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以設定的日誌級別
handler
handler物件負責傳送相關的資訊到指定目的地。Python的日誌系統有多種Handler可以使用。有些Handler可以把資訊輸出到控制檯,有些Logger可以把資訊輸出到檔案,還有些 Handler可以把資訊傳送到網路上。如果覺得不夠用,還可以編寫自己的Handler。可以通過addHandler()方法新增多個多handler
用法:
Handler.setLevel(lel):指定被處理的資訊級別,低於lel級別的資訊將被忽略
Handler.setFormatter():給這個handler選擇一個格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter物件
常用的Handler:
1) logging.StreamHandler
使用這個Handler可以向類似與sys.stdout或者sys.stderr的任何檔案物件(file object)輸出資訊。它的建構函式是:
StreamHandler([strm])
ps:其中strm引數是一個檔案物件。預設是sys.stderr
2) logging.FileHandler
和StreamHandler類似,用於向一個檔案輸出日誌資訊。不過FileHandler會幫你開啟這個檔案。它的建構函式是:
FileHandler(filename[,mode])
ps:filename是檔名,必須指定一個檔名;mode是檔案的開啟方式。參見Python內建函式open()的用法。預設是’a',即新增到檔案末尾。
3) logging.handlers.RotatingFileHandler
這個Handler類似於上面的FileHandler,但是它可以管理檔案大小。當檔案達到一定大小之後,它會自動將當前日誌檔案改名,然後建立 一個新的同名日誌檔案繼續輸出。比如日誌檔案是chat.log。當chat.log達到指定的大小之後,RotatingFileHandler自動把 檔案改名為chat.log.1。不過,如果chat.log.1已經存在,會先把chat.log.1重新命名為chat.log.2。。。最後重新建立 chat.log,繼續輸出日誌資訊。它的建構函式是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
ps:其中filename和mode兩個引數和FileHandler一樣。maxBytes用於指定日誌檔案的最大檔案大小。如果maxBytes為0,意味著日誌檔案可以無限大,這時上面描述的重新命名過程就不會發生。backupCount用於指定保留的備份檔案的個數。比如,如果指定為2,當上面描述的重新命名過程發生時,原有的chat.log.2並不會被更名,而是被刪除。
4) logging.handlers.TimedRotatingFileHandler
這個Handler和RotatingFileHandler類似,不過,它沒有通過判斷檔案大小來決定何時重新建立日誌檔案,而是間隔一定時間就 自動建立新的日誌檔案。重新命名的過程與RotatingFileHandler類似,不過新的檔案不是附加數字,而是當前時間。它的建構函式是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
ps:其中filename引數和backupCount引數和RotatingFileHandler具有相同的意義。interval是時間間隔。when引數是一個字串。表示時間間隔的單位,不區分大小寫。它有以下取值:
S 秒
M 分
H 小時
D 天
W 每星期(interval==0時代表星期一)
midnight 每天凌晨
2.應用:
在Django中的使用
1、專案裡sesetti.py裡配置
BASE_LOG_DIR = os.path.join(BASE_DIR, "log") LOGGING = { 'version': 1, # 保留字 'disable_existing_loggers': False, # 禁用已經存在的logger例項 # 日誌檔案的格式 'formatters': { # 詳細的日誌格式 'standard': { 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' '[%(levelname)s][%(message)s]' }, # 簡單的日誌格式 'simple': { 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' }, # 定義一個特殊的日誌格式 'collect': { 'format': '%(message)s' } }, # 過濾器 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, # 處理器 'handlers': { # 在終端列印 'console': { 'level': 'DEBUG', 'filters': ['require_debug_true'], # 只有在Django debug為True時才在螢幕列印日誌 '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', } }, }
2.使用
在檢視函式中的應用例項
import logging # 生成一個以當前檔名為名字的logger例項 logger = logging.getLogger(__name__) # 生成一個名為collect的logger例項 collect_logger = logging.getLogger("collect") def index(request): logger.debug("我是debug") logger.info("我是info") logger.error("發現一個error") collect_logger.info("user1:廣東") return HttpResponse("OK")
更多:https://docs.djangoproject.com/en/1.11/topics/logging/