蜕变,第二十八天

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配置文件

猜你喜欢

转载自blog.csdn.net/weixin_42157426/article/details/80734749