在生產環境中,將程序的運行日誌輸出保存到文件中是很必要的操做;當應用崩潰時,很容易經過查找日誌來定位問題。下面介紹一下django開發中如何將日誌輸出到文件中。python
首先看一下日誌級別有哪些:django
DEBUG:全部等級中最低,其信息通常用來做爲調試的輔助信息 INFO:程序的通常信息 WARNING:警告,一般用來對某些可能出現的錯誤且不會影響程序正常運行的信息進行警告。 ERROR:錯誤,表示出現了某種錯誤。 CRITICAL:崩潰,出現了嚴重級別的錯誤。
在django項目中使用logging模塊打印日誌的步驟以下:網絡
1.導入模塊 import logging 2.設置日誌等級 logging.basicConfig(level=logging.DEBUG) 3.獲取logger對象 logger = logging.getLogger(__name__) 4.打印日誌 logger.debug("logger日誌"),還有logger.info(),logger.warning()等方法
下面介紹一下logging中的四個組件,以下:spa
1.Loggers 2.Handlers 3.Filters 4.Formatters
Loggers(日誌記錄器),系統中的每一條日誌都是由該組件進行記錄的,每個記錄器都應該有其本身的名稱並標記其最低記錄的等級;當一條日誌給到logger時,logger會對該條信息的級別與自身的級別進行比較,若是該日誌級別不低於自己級別,logger就會進行下一步操做。若是日誌的信息級別比logger的低,那麼就會忽略這條日誌。
當logger通過級別的比較以後決定要對某條日誌進行處理時,就將該條日誌交給了Handlersdebug
Handlers(處理器),用來處理具體每條信息,例如是將日誌打印到屏幕仍是記錄到文件或者發送至某個網絡鏈接;它本身的記錄級別,若是日誌級別低於handler的級別,handler一樣會忽略掉該條日誌。調試
Filter(過濾器):提供了傳遞給handler以前的附加功能。在一般狀況下,一條日誌信息只要達到logger的級別以後就會傳遞給handler處理,可是咱們能夠經過使用filter來對日誌進行額外的過濾。
例如咱們可使用某個filter來控制只容許某個特定的源的ERROR級別的日誌。
Filter還運行我們在處理以前修改日誌,例如下降或者提升日誌的級別。
Filter能夠在logger和handler中同時使用,並且多個filter會同時工做。日誌
Formatter(格式化):定義了怎麼顯示內容,由於最終的日誌都會是以文本的形式展示,formatter就是描述怎麼來作這件事。formatter一般都是使用python格式化字符串的方法來對日誌進行格式化code
最後看一個日誌配置的例子:orm
logger.py: import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_LOG_DIR = os.path.join(BASE_DIR, "logs") LOGGING = { 'version': 1, # 保留的參數,默認是1 'disable_existing_loggers': False, # 是否禁用已經存在的logger實例 # 日誌輸出格式的定義 'formatters': { 'standard': { # 標準的日誌格式化 'format': '%(levelname)s %(asctime)s %(module)s %(message)s' }, 'error': { # 錯誤日誌輸出格式 'format': '%(levelname)s %(asctime)s %(pathname)s %(module)s %(message)s' }, 'simple': { 'format': '%(levelname)s %(asctime)s %(message)s' }, 'collect': { 'format': '%(message)s' } }, # 處理器:須要處理什麼級別的日誌及如何處理 'handlers': { # 將日誌打印到終端 'console': { 'level': 'DEBUG', # 日誌級別 'class': 'logging.StreamHandler', # 使用什麼類去處理日誌流 'formatter': 'simple' # 指定上面定義過的一種日誌輸出格式 }, # 默認日誌處理器 'default': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "xx.log"), # 日誌文件路徑 'maxBytes': 1024 * 1024 * 100, # 日誌大小 100M 'backupCount': 5, # 日誌文件備份的數量 'formatter': 'standard', # 日誌輸出格式 'encoding': 'utf-8', }, # 日誌處理級別warn 'warn': { 'level': 'WARN', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "warn.log"), # 日誌文件路徑 'maxBytes': 1024 * 1024 * 100, # 日誌大小 100M 'backupCount': 5, # 日誌文件備份的數量 'formatter': 'standard', # 日誌格式 'encoding': 'utf-8', }, # 日誌級別error 'error': { 'level': 'ERROR', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "error.log"), # 日誌文件路徑 'maxBytes': 1024 * 1024 * 100, # 日誌大小 100M 'backupCount': 5, 'formatter': 'error', # 日誌格式 'encoding': 'utf-8', }, }, 'loggers': { # 默認的logger應用以下配置 '': { 'handlers': ['default', 'warn', 'error'], 'level': 'DEBUG', 'propagate': True, # 若是有父級的logger示例,表示不要向上傳遞日誌流 }, 'collect': { 'handlers': ['console', 'default', 'warn', 'error'], 'level': 'INFO', } }, }
在settings.py中導入logger.py中的配置便可:對象
from logger.py import LOGGING
以上就是log日誌配置的介紹,歡迎交流!