init的作用
1)产生一个全局名称空间,提供给包的,就代表包的名称空间 2)管理 包可以直接点出来使用的 名字导包完成的三件事
1)编译形成包中__init__.py文件的pyc文件 2)执行__init__.py文件,形成一个全局名称空间,将__init__.py文件中所有名字存放其中,该名称空间就代表包的名称空间 3)在导包的文件中,产生一个与包名相同的名字,指向包的名称空间(__init__.py文件的全局名称空间)当你作为包的设计者来说 1.当模块的功能特别多的情况下 应该分文件管理 2.每个模块之间为了避免后期模块改名的问题 你可以使用相对导入(包里面的文件都应该是被导入的模块)
站在包的开发者 如果使用绝对路径来管理的自己的模块 那么它只需要永远以包的路径为基准依次导入模块 站在包的使用者 你必须得将包所在的那个文件夹路径添加到system path中
直接使用包中模块 如果只是想作为普通文件夹,py3中可以省略__init__文件,本质上文件夹也是包 python2如果要导入包 包下面必须要有__init__.py文件 导入的手段:1.指名道姓到某一个模块 | 2.指名道姓到某一个模块中的名字 包的管理 在包中采用相对导入管理模块或模块中的名字 在包的__init__.py文件或是包中任意一个模块中 . 代表当前文件所在目录 .. 代表当前文件所在目录的上一级目录 ...代表上一级的上一级文件夹 注:.语法不能出包,因为包外的文件都能自执行,但拥有.开头导入的文件不能自执行
五个级别
logging.debug('调试')对应的数字 10 logging.info('信息') 20 logging.warning('警告') 30 logging.error('错误') 40 logging.critical('严重') 50 五个级别
四个对象
logger对象 产生日志 filter对象 过滤 handler 句柄(控制日志输出的位置(文件或终端)) formatter对象 格式化 四个对象流程
import logging # 1.logger对象 logger = logging.getLogger('转账记录') # 2.filter对象 过滤 # 3.handler对象 hd1 = logging.FileHandler('a1.log',encoding='utf-8') # 输出到文件 hd2 = logging.FileHandler('a2.log',encoding='utf-8') # 输出到文件 hd3= logging.StreamHandler() # 输出到终端 不需要填写参数 # 4.formatter对象 fm1 = logging.Formatter( fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', ) fm2 = logging.Formatter( fmt='%(asctime)s - %(name)s: %(message)s', datefmt='%Y-%m-%d', ) #5. 给logger对象绑定handler logger.addHandler(hd1) logger.addHandler(hd2) logger.addHandler(hd3) # 6.给handler绑定formatter对象 hd1.setFormatter(fm1) hd2.setFormatter(fm2) hd3.setFormatter(fm1) # 7.设置日志等级 logger.setLevel(20) # 8.记录日志 logger.debug('QWERTYUI风格都搞不好局') 流程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' # 定义日志输出格式 结束 """ 下面的两个变量对应的值 需要你手动修改 """ logfile_dir = os.path.dirname(__file__) # log文件的目录 logfile_name = 'a3.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 }, }, 'filters': {}, # 过滤日志 'handlers': { #打印到终端的日志 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': 'simple' }, #打印到文件的日志,收集info及以上的日志 'default': { 'level': 'DEBUG', '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配置 '': { 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True, # 向上(更高level的logger)传递 }, # 当键不存在的情况下 默认都会使用该k:v配置 }, } # 使用日志字典配置 logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置 logger1 = logging.getLogger('asajdjdskaj') logger1.debug('好好的 不要浮躁 努力就有收获') View Code
转载于:https://www.cnblogs.com/komorebi/p/11215800.html