不管是純python項目或者是django項目,日志的使用大同小異,主要分為兩個步驟:
- logging 的配置
- logging 的使用
logging的配置
python中有三種配置日志的方式:
-
使用python代碼顯示的創建loggers,handlers,formatters,並分別調用他們的配置函數
-
創建一個日志配置文件,然后使用 fileConfig 方法進行配置
示例:
# 讀取日志配置文件內容 logging.config.fileConfig('logging.conf') # 創建一個日志器logger logger = logging.getLogger('simpleExample') # 日志輸出 logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
示例配置文件 logging.conf:
[loggers] keys=root,simpleExample [handlers] keys=fileHandler,consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=fileHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler] class=StreamHandler args=(sys.stdout,) level=DEBUG formatter=simpleFormatter [handler_fileHandler] class=FileHandler args=('logging.log', 'a') level=ERROR formatter=simpleFormatter [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
-
使用字典配置信息
日志配置四大組件:
日志配置數據結構,這里主要使用 Dict 的方式配置日志。
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 可選項,默認值為True。該選項用於指定是否禁用已存在的日志器loggers
'formatters': {
'standard': {'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s] %(message)s'}
},
'handlers':{},
'loggers':{},
'root':{} # 可選項,這是root logger的配置信息,其值也是一個字典對象。除非在定義其它logger時明確指定propagate值為no,否則root logger定義的handlers都會被作用到其它logger上
}
-
Loggers (日志記錄器)
用來配置選擇哪種 Handles 處理日志
-
Handles (處理器)
定義處理日志的方式。logging 模塊提供了一些處理器,例如:
- handlers.FileHandler(filename):將日志消息寫入文件filename。、
- handlers.RotatingFileHandler(filename):將日志消息寫入文件filename。如果文件的大小超出maxBytes制定的值,那么它將被備份為filename1。
- StreamHandler:將日志寫入到控制台
- TimedRotatingFileHandler:按照時間分割日志文件,可按天、周、分、秒保存日志文件
-
Filters (過濾器)
-
Formatters (格式化日志輸出)
定義日志輸出格式。
示例: 'formatters': { 'standard': { 'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s] %(message)s'} }, %(name)s 記錄器的名稱 %(levelno)s 數字形式的日志記錄級別 %(levelname)s 日志記錄級別的文本名稱 %(filename)s 執行日志記錄調用的源文件的文件名稱 %(pathname)s 執行日志記錄調用的源文件的路徑名稱 %(funcName)s 執行日志記錄調用的函數名稱 %(module)s 執行日志記錄調用的模塊名稱 %(lineno)s 執行日志記錄調用的行號 %(created)s 執行日志記錄的時間 %(asctime)s 日期和時間 %(msecs)s 毫秒部分 %(thread)d 線程ID %(threadName)s 線程名稱 %(process)d 進程ID %(message)s 記錄的消息
logging的使用
import logging
logger = logging.getLogger("console") # 顯示調用配置字典定義好的loggers里面的日志記錄器。
logger = logging.getLogger(__name__)
def index(request):
logger.debug("hello")
django中使用logging
django中使用logging,只需在 settings.py 中定義配置字典 LOGGING,示例如下:
settings.py :
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s] %(message)s'}
# 日志格式
},
'filters': {
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/QWebFX_{}.log'.format(BASE_DIR, datetime.datetime.now().date()), # 日志輸出文件
'maxBytes': 1024 * 1024 * 5, # 文件大小
'backupCount': 5, # 備份份數
'formatter': 'standard', # 使用哪種formatters日志格式
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/Error/QWebFX_Error_{}.log'.format(BASE_DIR, datetime.datetime.now().date()),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standard',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
'request_handler': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/Request/QWebFX_Request_{}.log'.format(BASE_DIR, datetime.datetime.now().date()),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standard',
},
'scripts_handler': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/Script/QWebFX_Script_{}.log'.format(BASE_DIR, datetime.datetime.now().date()),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standard',
}
},
'loggers': {
'django': { # django,打印所有信息到名稱為console的handler。
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
'django.request': {
'handlers': ['request_handler'],
'level': 'DEBUG',
'propagate': False,
},
'scripts': {
'handlers': ['scripts_handler'],
'level': 'INFO',
'propagate': False
},
'console': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True
},
# API/Views 模塊的日志處理
'views': {
'handlers': ['default', 'error'],
'level': 'DEBUG',
'propagate': True
},
'util': {
'handlers': ['error'],
'level': 'ERROR',
'propagate': True
},
}
}