Django之logging日誌使用

Logger模塊

    是python中用於便捷記錄日誌且線程安全的模塊python

使用logging模塊記錄日誌涉及四個主要類:

    logger提供了應用程序能夠直接使用的接口;django

    handler將(logger建立的)日誌記錄發送到合適的目的輸出;安全

    filter提供了細度設備來決定輸出哪條日誌記錄;網絡

    formatter決定日誌記錄的最終輸出格式函數

1.具體介紹:

logger

      每一個程序在輸出信息以前都要得到一個Logger。Logger一般對應了程序的模塊名。工具

好比聊天工具的圖形界面模塊能夠這樣得到它的Logger:ui

    LOG=logging.getLogger(」chat.gui」)spa

而核心模塊能夠這樣:線程

    LOG=logging.getLogger(」chat.kernel」)debug

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中的使用

    一、項目裏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/

相關文章
相關標籤/搜索