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

Django之logging日誌

打印 con red utils default version app 定義 req

簡介

Django使用python自帶的logging 作為日誌打印工具。簡單介紹下logging。

logging 是線程安全的,其主要由4部分組成:

  1. Logger
    用戶使用的直接接口,將日誌傳遞給Handler
  2. Handler
    控制日誌輸出到哪裏,console,file…
    一個logger可以有多個Handler
  3. Filter
    控制哪些日誌可以從logger流向Handler
  4. Formatter
    控制日誌的格式

使用

項目裏sesetti.py裏配置

Django通過在settings文件中使用LOGGING來定制日誌輸出(包括定義logger, handler, formatter等)

例如,settings文件中定義如下:

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‘,
        }
    },
}

views.py裏使用

import logging
# 生成一個以當前文件名為名字的logger實例
logger = logging.getLogger(__name__)
# 生成一個名為collect的logger實例
collect_logger = logging.getLogger("collect")

def index(request):
    logger.debug("一個萌萌的請求過來了。。。。")
    logger.info("一個更萌的請求過來了。。。。")
    logger.debug("這是app01裏面的index視圖函數")

    collect_logger.info("用戶1:河南")

    return HttpResponse("OK")

流程

技術分享圖片

Django之logging日誌