logging日志模块
# 日志就是记录一些信息,方便查询或者辅助开发。
分为两种:
1、记录文件
2、显示屏幕。
# 低配
# 低配 import logging # 五种级别,由低到高,默认从warning级别显示。 logging.basicConfig( # level=logging.DEBUG, level=10, # 显示的级别 format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s', # 显示格式 datefmt='%Y %m %d', # 日期 # filename='a.log', # 默认是a模式, 就是使用的gbk 编码。 # filemode='w' 一般不用改。 ) logging.debug('调试模式') # 10 logging.info('正常运行') # 20 logging.warning('警告') # 30 logging.error('错误') # 40 logging.critical('系统崩了') # 50
# 低配:只能写入文件或者屏幕输出。
标配:
# 标配 import logging print(logging) # # 1、 创建logging对象 logger = logging.getLogger() # 2、 创建文件对象 fh1 = logging.FileHandler('a1.log', encoding='utf-8') fh2 = logging.FileHandler('a2.log', encoding='utf-8') # ...... # 3、 创建屏幕对象 sh = logging.StreamHandler() # 4、给2个文件对象和1个屏幕对象创建格式化 formater1 = logging.Formatter( fmt='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s', # 显示格式 datefmt='%Y-%m-%d %H:%M:%S',) formater2 = logging.Formatter( fmt='%(asctime)s %(levelname)s %(message)s', # 显示格式 datefmt='%Y-%m-%d %H:%M:%S',) formater3 = logging.Formatter( fmt='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s', # 显示格式 datefmt='%Y-%m-%d %H:%M:%S',) # 5、给对象绑定格式(武功) fh1.setFormatter(formater1) fh2.setFormatter(formater2) sh.setFormatter(formater3) # 6、给logger对象添加其他对象(加入天龙八部这本书) logger.addHandler(fh1) logger.addHandler(fh2) logger.addHandler(sh) # 设置logger级别(手动指定级别) logger.setLevel(10) sh.setLevel(50) # 按照logger对象设置的级别显示 fh1.setLevel(30) fh2.setLevel(30) logging.debug('调试模式') # 10 logging.info('正常运行') # 20 logging.warning('警告') # 30 logging.error('错误') # 40 logging.critical('系统崩了') # 50
实例:
import logging from logging import handlers class Logger: level_relations = { 'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING, 'error': logging.ERROR, 'crit': logging.CRITICAL }#日志级别关系映射 def __init__(self, filename, level='info', when='D', backCount=5, fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'): # print(self) self.logger = logging.getLogger() # print(self.logger) #<RootLogger root (WARNING)> self.logger = logging.getLogger(filename) # print(self.logger) #<Logger all.log (WARNING)> format_str = logging.Formatter(fmt) # 设置日志格式 self.logger.setLevel(self.level_relations.get(level)) # 设置日志级别 # print(self.level_relations.get(level)) # 往文件里写入#指定间隔时间自动生成文件的处理器 th = handlers.TimedRotatingFileHandler(filename=filename, when=when, backupCount=backCount, encoding='utf-8') # print(th.when,th.backupCount) th.setFormatter(format_str) # 设置文件里写入的格式 sh = logging.StreamHandler() # 往屏幕上输出 sh.setFormatter(format_str) # 设置屏幕上显示的格式 self.logger.addHandler(sh) # 把对象加到logger里 self.logger.addHandler(th) if __name__ == '__main__': log = Logger('all.log', level='info') # Logger('all.log', level='debug') # print(log) #<__main__.Logger object at 0x00C4F670> log.logger.debug('调试模式') log.logger.info('正常运行') log.logger.warning('警告') log.logger.error('报错了') log.logger.critical('系统崩了') log2 = Logger('error.log', level='warning') log2.logger.error('支付出错了!!!')
# 高配。
# 通过导入文件(导入字典的方式)写日志 Django。
""" logging配置 """ 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指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' # 定义日志输出格式 结束 # print(__file__) logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录 logfile_name = '高配版.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, # 版本 'disable_existing_loggers': False, # 'formatters': { 'standard': { 'format': standard_format }, 'simple': { 'format': simple_format }, 'id_simple_format':{ 'format': id_simple_format } }, 'filters': {}, 'handlers': { #打印到终端的日志 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': 'simple' }, #打印到文件的日志,收集info及以上的日志 'default': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 'formatter': 'standard', 'filename': logfile_path, # 日志文件 'maxBytes': 300, # 日志大小 300bytes 'backupCount': 5, # 最多只有5个文件 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, }, 'loggers': { #logging.getLogger(__name__)拿到的logger配置 '': { 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True, # 向上(更高level的logger)传递 }, }, } logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 # # logging.config # 将你写好的logging 字典 在导入logging.config后,传到logging模块中 logger = logging.getLogger() # 生成一个log实例 通过字典自己设置的个性化的log对象 logger.info('正常运行状态') # 记录该文件的运行状态
作者:wangkaiok —— 小菜鸟111
出处:http://www.cnblogs.com/wangkaiok/
本文版权归作者和博客园共有,但未经作者同意禁止转载,转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。