Python的学习之旅———logging模块
日志模块的级别
critical=50
error=40
warning=30
info=20
debug=10
notset=0
1 import logging #默认的日志级别是:warning,默认的输出目标是:终端 2 3 logging.debug('debug') 4 logging.info('info') 5 logging.warning('warn123') 6 logging.error('error') 7 logging.critical('critical')
logging模块的主要部分
1logger=logging.getLogger() l
ogger:日志对象,logging模块中最基础的对象,用logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名字我们对应模块名,如聊天模块、数据库模块、验证模块等。
2 Handler 对象
3 Formatter
4 Filter
1 import logging 2 #一:Logger对象:负责产生日志信息 3 logger=logging.getLogger('root') 4 5 6 #二:Filter对象:略 7 8 9 #三:Handler对象:负责接收Logger对象传来的日志内容,控制打印到终端or文件 10 h1=logging.FileHandler('t1.log') 11 h2=logging.FileHandler('t2.log') 12 h3=logging.StreamHandler() 13 14 15 #四:formmater对象 16 #给文件 17 formatter1=logging.Formatter( 18 '%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 19 datefmt='%Y-%m-%d %H:%M:%S %p', 20 ) 21 22 #给终端 23 formatter2=logging.Formatter( 24 '%(asctime)s - %(message)s', 25 datefmt='%Y-%m-%d %H:%M:%S %p', 26 ) 27 28 #五:为handler对象绑定日志格式,设置日志级别 29 #给文件:绑定到Filehandler对象 30 h1.setFormatter(formatter1) 31 h2.setFormatter(formatter1) 32 #给终端:绑定到Streamhandler对象 33 h3.setFormatter(formatter2) 34 35 #设置日志级别 36 h1.setLevel(30) 37 h2.setLevel(30) 38 h3.setLevel(30) 39 40 41 #六:把h1,h2,h3都add给logger,这样logger对象才能把自己的日志交给他们三负责输出 42 logger.addHandler(h1) 43 logger.addHandler(h2) 44 logger.addHandler(h3) 45 logger.setLevel(20) #括号的数字一定要<=Hanlder对象的数字 46 47 48 #七:测试 49 # logger.debug('debug') 50 # logger.info('info') 51 # logger.warning('warn123') #30 52 # logger.error('error') 53 # logger.critical('critical')
用法推荐:
使用字典配置的方法
将配置文件写成字典的形式.
使用
导入logging
导入logging.config
将写好的字典传给logging.config.dicConfig()
配置字典
1 """ 2 logging配置 3 """ 4 5 import os 6 import logging.config 7 8 # 定义三种日志输出格式 开始 9 10 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ 11 '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字 12 13 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' 14 15 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' 16 17 # 定义日志输出格式 结束 18 19 logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录 20 21 logfile_name = 'all2.log' # log文件名 22 23 # 如果不存在定义的日志目录就创建一个 24 if not os.path.isdir(logfile_dir): 25 os.mkdir(logfile_dir) 26 27 # log文件的全路径 28 logfile_path = os.path.join(logfile_dir, logfile_name) 29 30 # log配置字典 31 LOGGING_DIC = { 32 'version': 1, 33 'disable_existing_loggers': False, 34 'formatters': { 35 'standard': { 36 'format': standard_format 37 }, 38 'simple': { 39 'format': simple_format 40 }, 41 }, 42 'filters': {}, 43 'handlers': { 44 #打印到终端的日志 45 'console': { 46 'level': 'DEBUG', 47 'class': 'logging.StreamHandler', # 打印到屏幕 48 'formatter': 'simple' 49 }, 50 #打印到文件的日志,收集info及以上的日志 51 'default': { 52 'level': 'DEBUG', 53 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 54 'formatter': 'standard', 55 'filename': logfile_path, # 日志文件 56 'maxBytes': 1024*1024*5, # 日志大小 5M 57 'backupCount': 5, 58 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 59 }, 60 }, 61 'loggers': { 62 #logging.getLogger(__name__)拿到的logger配置 63 '': { 64 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 65 'level': 'DEBUG', 66 'propagate': True, # 向上(更高level的logger)传递 67 }, 68 }, 69 } 70 71 72 def load_my_logging_cfg(): 73 logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 74 logger = logging.getLogger(__name__) # 生成一个log实例 75 logger.info('It works!') # 记录该文件的运行状态 76 77 if __name__ == '__main__': 78 load_my_logging_cfg() 79 80 logging配置文件
logger=logging.getLogger(name) 获取logger
此处的name对应的是字典中loggers选项 ,如下
1 'loggers': { 2 #logging.getLogger(__name__)拿到的logger配置 3 # l1=logging.getLogger('collect')拿到的logger配置 4 # l2=logging.getLogger('l1')拿到的logger配置 5 '': { 6 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 7 'level': 'DEBUG', 8 'propagate': True, # 向上(更高level的logger)传递 9 }, 10 'collect': { 11 'handlers': ['collect', ], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 12 'level': 'DEBUG', 13 'propagate': False, # 向上(更高level的logger)传递 14 },
这个字典一个选项默认是空.这样你传入的参数可以使用name=__name__ 的形式传入参数.这么传入参数的逻辑是传入的参数
1 是'__main__' 或者是代码所在的文件名.无论哪种,在字典中都没有对应的值,logging模块做了一个判断,获取的是字典中' '的选项
2 传入的是字典中对应的名字 'collect'那就获取了对应的配置选项.