1、什么是包
包是模块的一种形式,包的本质就是一个含有__init__.py文件的文件夹
2.为什么要有包
因为如果我们要把我们写的一大堆功能分类处理,并且数量众多,我们需要进行分文件存储,则需要用到包的概念
3、如何用包
导入包就是在包下的__init__.py
import ...
from ... import ...
注意的问题:
1、包内所有的文件都是被导入使用的,而不是被直接运行的
2、包内部模块之间的导入可以使用绝对导入(以包的根目录为基准)与相对导入(以当前被导入的模块所在的目录为基准)
推荐使用相对导入
3、当文件是执行文件时,无法在该文件内用相对导入的语法
只有文件被当作模块导入时,该文件内才能使用相对导入的语法
4、凡是在导入时带点的,点的左边都必须是一个包
import aaa.bbb.m3.f3 #错误
日志模块
进行基本的日志配置(了解)
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, # stream=True )
日子级别遵循原则:自下而上进行匹配 # debug->info->warning->error->critical
logging.debug('调试信息') #10 logging.info('正常信息') #20 logging.warning('不好啦着火啦') #30 logging.error('报错信息') #40 logging.critical('严重错误信息') #50
这样运用日志模块遇到的问题:
1、没有指定日志级别
2、没有指定日志格式
3、只能往屏幕打印,没有写入文件
4、不能指定字符编码
5、只能在文件中打印
写日子格式的7个过程:
1、logger:负责产生日志信息
2、filter:负责筛选日志(目前不需要了解)
3、formatter:控制日志输出格式
4、handler:负责日志输出的目标
5、绑定logger对象与handleer对象
6、绑定handler对象与formatter对象
7、设置日志级别,可以在两个关卡进行设置logger与handler
logger1.setLevel(10) h1.setLevel(10) h2.setLevel(10) sm.setLevel(10)
日志的模板设置:
"""
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'
# 定义日志输出格式 结束
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,
'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)传递
},
},
}
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()
logging配置文件