1. 程式人生 > >Django之logging日誌使用

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/