Django日誌——輸出到log文件

咱們都知道在項目中日誌是很是重要的,由於項目在服務器中運行出現了Bug沒有日誌去記錄,咱們可能根本就不知道存在這個Bug。之前在學校本身搞搞開發沒以爲,如今想一想日誌真的不可或缺。python

首先了解日誌的5個等級:django

  1. debug:出於調試目的的低層次系統信息
  2. info:普通的系統信息列表內容
  3. warning:描述已經發生的小問題
  4. error:描述已經發生的主要問題
  5. critical:描述已經發生的嚴重問題

第一步:配置Django中的setting.py文件json

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False if DEBUG else True,  # 是否禁用已經存在的日誌器
    'formatters': {  # 日誌信息顯示的格式
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)s %(message)s'
            # "class": "pythonjsonlogger.jsonlogger.JsonFormatter"
        },
        'simple': {
            'format': '%(levelname)s %(asctime)s %(module)s %(funcName)s %(lineno)d %(message)s'
            # "class": "pythonjsonlogger.jsonlogger.JsonFormatter"
        },  # 日誌記錄級別+時間日期+模塊名稱+函數名稱+行號+記錄消息
    },
    'filters': {  # 對日誌進行過濾
        'require_debug_true': {  # django在debug模式下才輸出日誌
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {  # 日誌處理方法
        'console': {  # 向終端中輸出日誌
            'level': 'DEBUG' if DEBUG else 'INFO',
            'filters': ['require_debug_true'],  # debug爲true纔會輸出
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'info': {  # 向文件中輸出日誌
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR+'/logs/', "info.log"),  # 日誌文件的位置
            'maxBytes': 300 * 1024 * 1024,  # 300M大小
            'backupCount': 10,
            'formatter': 'verbose',
            'encoding': 'utf-8'
        },
        'demo': {   # 專門定義一個收集特定信息的日誌
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自動切
            'filename': os.path.join(BASE_DIR+'/logs/', "demo.log"),
            'maxBytes': 1024 * 1024 * 50,  # 日誌大小 50M
            'backupCount': 5,
            'formatter': 'verbose',
            'encoding': "utf-8"
        },
        'city': {   # 專門定義一個收集特定信息的日誌
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自動切
            'filename': os.path.join(BASE_DIR+'/logs/', "city.log"),
            'maxBytes': 1024 * 1024 * 50,  # 日誌大小 50M
            'backupCount': 5,
            'formatter': 'verbose',
            'encoding': "utf-8"
        },

    },
    'loggers': {  # 日誌器
        "django": {        # 默認的logger應用以下配置
            "handlers": ["info", "console"],
            "propagate": True,
            "level": "INFO"
        },
        'demo_log': {      # 名爲 'demo'的logger還單獨處理
            'handlers': ['demo'],
            "propagate": True,
            'level': 'INFO',
        },
        'city_log': {      # 名爲 'city'的logger還單獨處理
            'handlers': ['city'],
            "propagate": True,
            'level': 'INFO',
        },
    }
    }

formatters:日誌信息顯示的格式,能夠定義多種格式,上面定義了'verbose'和'simple'兩種格式:
例如'verbose'的格式爲'%(levelname)s %(asctime)s %(module)s %(lineno)s %(message)s'
在log文件打印的例子就會是這樣:INFO 2019-12-05 09:04:28,707 views 234 打印出來了!!!
handlers:日誌處理方法,能夠定義多種方法,通常我習慣每增長一個Django子應用就新增一個,上面的'demo'和'city'是子應用。
loggers:日誌器,我習慣和handlers一一對應編寫。
handlers與loggers都存在level,二者不一樣:
一、loggers中的level表示能夠接受的錯誤級別,就是說loggers接受level或者比level更高級別的錯誤,由propagate決定:propagate爲True, 則向上傳播;
二、handlers的level表示日誌級別
注:要在項目根目錄新建logs目錄,用於存放log日誌文件,日誌文件不須要手動新建,項目運行的時候會自行新建。服務器

第二步:新增exceptions.py文件封裝日誌函數

import logging
logger = logging.getLogger('django')
logger_demo = logging.getLogger('demo_log')
logger_city = logging.getLogger('city_log')

第三步:打印日誌ui

logger.info("我打印在控制檯上也打印在info.log上")
logger.error("我打印在控制檯上也打印在info.log上")
logger_demo.info("我打印在demo.log上")
logger_demo.error("我打印在demo.log上")
logger_city.info("我打印在city.log上")
logger_city.error("我打印在city.log上")

這樣就完成了,是否是很簡單很easy!!!debug

相關文章
相關標籤/搜索