咱們都知道在項目中日誌是很是重要的,由於項目在服務器中運行出現了Bug沒有日誌去記錄,咱們可能根本就不知道存在這個Bug。之前在學校本身搞搞開發沒以爲,如今想一想日誌真的不可或缺。python
首先了解日誌的5個等級:django
第一步:配置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