在項目開發時,我們總是離不開日誌。只有我們多記一些日誌,在程序出現意想不到的問題時,才能第一時間準確的排查,並且可以查看程序的一些信息。
在python中,日誌功能一般使用logging模塊。如何有效的進行日誌的設置,每個人都有自己的想法。在網絡上看見使用字典進行日誌的一些配置,這種風格我很喜歡,特記錄在此。
import os
import logging.config #不能只導入logging
BASE_DIR=os.path.dirname(os.path.dirname(__file__))
# DB_PATH=os.path.join(BASE_DIR,'db')
# DB_PATH=r'%sdb' %BASE_DIR
# 定義日誌文件的路徑
LOG_PATH=os.path.join(BASE_DIR,'log','access.log')
LOG_PATH=r'%slogaccess.log' %BASE_DIR
BOSS_LOG_PATH=r'%slogboss.log' %BASE_DIR
# 定義三種日誌輸出格式 開始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]' #其中name爲getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 定義日誌輸出格式 結束
logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目錄
logfile_name = 'all2.log' # log文件名
# 如果不存在定義的日誌目錄就創建一個
if not os.path.isdir(logfile_dir):
os.mkdir(logfile_dir)
# log文件的全路徑
logfile_path = os.path.join(logfile_dir, logfile_name)
# log配置字典
LOGGING_DIC = {
'version': 1,
# 禁用已經存在的logger實例
'disable_existing_loggers': False,
# 定義日誌 格式化的 工具
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
'id_simple': {
'format': id_simple_format
},
},
# 過濾
'filters': {}, # jango此處不同
'handlers': {
#打印到終端的日誌
'stream': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日誌,收集info及以上的日誌
'access': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日誌文件路徑
'maxBytes': 1024*1024*5, # 日誌大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日誌文件的編碼,再也不用擔心中文log亂碼了
},
#打印到文件的日誌,收集error及以上的日誌
'boss': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'id_simple',
'filename': BOSS_LOG_PATH, # 日誌文件
# 'maxBytes': 1024*1024*5, # 日誌大小 5M
'maxBytes': 300, # 日誌大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日誌文件的編碼,再也不用擔心中文log亂碼了
},
},
# logger實例
'loggers': {
# 默認的logger應用如下配置
'': {
'handlers': ['stream', 'access','boss'], # 這裏把上面定義的兩個handler都加上,即log數據既寫入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)傳遞
},
# logging.getLogger(__name__)拿到的logger配置
# 這樣我們再取logger對象時logging.getLogger(__name__),不同的文件__name__不同,這保證了打印日誌時標識信息不同,
# 但是拿着該名字去loggers裏找key名時卻發現找不到,於是默認使用key=''的配置
},
}
def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC) # 導入上面定義的logging配置
logger = logging.getLogger(__name__) # 生成一個log實例
logger.info('It works!') # 記錄該文件的運行狀態
if __name__ == '__main__':
load_my_logging_cfg()
#從common.py引用,要傳入name,且有返回log實例
# import logging.config
# import logging
# from conf import setting
# def get_logger(name):
#logging.config.dictConfig(setting.LOGGING_DIC) # 導入上面定義的logging配置
#l1=logging.getLogger(name)
#return l1
#src.py
# logger1 = common.get_logger('查看餘額')
# logger1.debug( dic_user_check['money'] )