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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM