070 logging模块

馋奶兔 提交于 2019-11-27 13:51:18

logging模块

1.v1

  • v1版本无法指定日志的级别;无法指定日志的格式;只能往屏幕打印,无法写入文件。

1.日志总共分为以下五个级别:

  • logging.debug('调试')
  • logging.info('正常')
  • logging.critical('严重错误')
  • logging.error('错误')
  • logging.warning('警告')

默认运行,会显示:

WARNING:root:警告信息
ERROR:root:报错信息
CRITICAL:root:严重错误信息

2.v2

  • v2版本不能指定字符编码;只能往文件中打印。
logging.basicConfig(filename='access.log',                     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',                     datefmt='%Y-%m-%d %H:%M:%S %p',                     level=10)  logging.debug('调试信息')  # 10 logging.info('正常信息')  # 20 logging.warning('警告信息')  # 30 logging.error('报错信息')  # 40 logging.critical('严重错误信息')  # 50

3.v3

logging模块包含四种角色:logger、Filter、Formatter对象、Handler

  1. logger:产生日志的对象
  2. Filter:过滤日志的对象
  3. Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式
  4. Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
# 1. 生成一个logger对象 logger = logging.getLogger('nick')  # 2. 生成格式 formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',                                datefmt='%Y-%m-%d %H:%M:%S %p',) formmater2 = logging.Formatter('%(asctime)s :  %(message)s',                                datefmt='%Y-%m-%d %H:%M:%S %p',) formmater3 = logging.Formatter('%(name)s %(message)s',)  # 3. 生成一个文件对象 h1 = logging.FileHandler('h1.log') h2 = logging.FileHandler('h2.log') sm = logging.StreamHandler()   # 4. 文件绑定格式 h1.setFormatter(formmater1) h2.setFormatter(formmater2) sm.setFormatter(formmater3)   # 5. 绑定文件 logger.addHandler(h1) logger.addHandler(h2) logger.addHandler(sm)  # 6. 控制级别 logger.level = 50  # 7. 使用 logger.debug('调试信息')  # 10 logger.info('正常信息')  # 20 logger.warning('警告信息')  # 30 logger.error('报错信息')  # 40 logger.critical('严重错误信息')  # 50
''' critical=50 error =40 warning =30 info = 20 debug =10 '''   import logging  # 1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出 logger = logging.getLogger(__file__)  # 2、Filter对象:不常用,略  # 3、Handler对象:接收logger传来的日志,然后控制输出 h1 = logging.FileHandler('t1.log')  # 打印到文件 h2 = logging.FileHandler('t2.log')  # 打印到文件 sm = logging.StreamHandler()  # 打印到终端  # 4、Formatter对象:日志格式 formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',                                datefmt='%Y-%m-%d %H:%M:%S %p',)  formmater2 = logging.Formatter('%(asctime)s :  %(message)s',                                datefmt='%Y-%m-%d %H:%M:%S %p',)  formmater3 = logging.Formatter('%(name)s %(message)s',)   # 5、为Handler对象绑定格式 h1.setFormatter(formmater1) h2.setFormatter(formmater2) sm.setFormatter(formmater3)  # 6、将Handler添加给logger并设置日志级别 logger.addHandler(h1) logger.addHandler(h2) logger.addHandler(sm)  # 设置日志级别,可以在两个关卡进行设置logger与handler # logger是第一级过滤,然后才能到handler logger.setLevel(30) h1.setLevel(10) h2.setLevel(10) sm.setLevel(10)  # 7、测试 logger.debug('debug') logger.info('info') logger.warning('warning') logger.error('error') logger.critical('critical')

二、高配logging

2.1 配置日志文件

以上三个版本的日志只是为了引出我们下面的日志配置文件

import os import logging.config  # 定义三种日志输出格式 开始 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \                   '[%(levelname)s][%(message)s]'  # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行 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.dirname(os.path.abspath(__file__)))  # log文件的目录,需要自定义文件路径 # atm logfile_dir = os.path.join(logfile_dir, 'log')  # C:\Users\oldboy\Desktop\atm\log  logfile_name = 'log.log'  # log文件名,需要自定义路径名  # 如果不存在定义的日志目录就创建一个 if not os.path.isdir(logfile_dir):  # C:\Users\oldboy\Desktop\atm\log     os.mkdir(logfile_dir)  # log文件的全路径 logfile_path = os.path.join(logfile_dir, logfile_name)  # C:\Users\oldboy\Desktop\atm\log\log.log # 定义日志路径 结束  # log配置字典 LOGGING_DIC = {     'version': 1,     'disable_existing_loggers': False,     'formatters': {         'standard': {             'format': standard_format         },         'simple': {             'format': simple_format         },     },     'filters': {},  # filter可以不定义     'handlers': {         # 打印到终端的日志         'console': {             'level': 'DEBUG',             'class': 'logging.StreamHandler',  # 打印到屏幕             'formatter': 'simple'         },         # 打印到文件的日志,收集info及以上的日志         'default': {             'level': 'INFO',             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件             'formatter': 'standard',             'filename': logfile_path,  # 日志文件             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M  (*****)             'backupCount': 5,             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了         },     },     'loggers': {         # logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')         '': {             # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕             'handlers': ['default', 'console'],             'level': 'DEBUG',             'propagate': False,  # 向上(更高level的logger)传递         },     }, }    def load_my_logging_cfg():     logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置     logger = logging.getLogger(__name__)  # 生成一个log实例     logger.info('It works!')  # 记录该文件的运行状态          return logger   if __name__ == '__main__':     load_my_logging_cfg()

2.2 使用日志

import time import logging import my_logging  # 导入自定义的logging配置  logger = logging.getLogger(__name__)  # 生成logger实例   def demo():     logger.debug("start range... time:{}".format(time.time()))     logger.info("中文测试开始。。。")     for i in range(10):python         logger.debug("i:{}".format(i))         time.sleep(0.2)     else:         logger.debug("over range... time:{}".format(time.time()))     logger.info("中文测试结束。。。")   if __name__ == "__main__":     my_logging.load_my_logging_cfg()  # 在你程序文件的入口加载自定义logging配置     demo()

三、Django日志配置文件

# logging_config.py  LOGGING = {     'version': 1,     'disable_existing_loggers': False,     'formatters': {         'standard': {             'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'                       '[%(levelname)s][%(message)s]'         },         'simple': {             'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'         },         'collect': {             'format': '%(message)s'         }     },     'filters': {         'require_debug_true': {             '()': 'django.utils.log.RequireDebugTrue',         },     },     'handlers': {         # 打印到终端的日志         'console': {             'level': 'DEBUG',             'filters': ['require_debug_true'],             'class': 'logging.StreamHandler',             'formatter': 'simple'         },         # 打印到文件的日志,收集info及以上的日志         'default': {             'level': 'INFO',             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切             'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"),  # 日志文件             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M             'backupCount': 3,             'formatter': 'standard',             'encoding': 'utf-8',         },         # 打印到文件的日志:收集错误及以上的日志         'error': {             'level': 'ERROR',             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切             'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"),  # 日志文件             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M             'backupCount': 5,             'formatter': 'standard',             'encoding': 'utf-8',         },         # 打印到文件的日志         'collect': {             'level': 'INFO',             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切             'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M             'backupCount': 5,             'formatter': 'collect',             'encoding': "utf-8"         }     },     'loggers': {         # logging.getLogger(__name__)拿到的logger配置         '': {             'handlers': ['default', 'console', 'error'],             'level': 'DEBUG',             'propagate': True,         },         # logging.getLogger('collect')拿到的logger配置         'collect': {             'handlers': ['console', 'collect'],             'level': 'INFO',         }     }, }   # ----------- # 用法:拿到俩个logger  logger = logging.getLogger(__name__)  # 线上正常的日志 collect_logger = logging.getLogger("collect")  # 领导说,需要为领导们单独定制领导们看的日志
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!