zoukankan      html  css  js  c++  java
  • 15.区分py文件的两种用途。包的基本使用,logging日志模块

    • 引子
    • 区分py文件的两种用途

    • 包的基本使用

    • 首次导入包发生的事情
    • 包总结
    • logging日志模块


    • 区分py文件的两种用途

    编写好的一个python文件可以有两种用途:

    一:脚本,一个文件就是整个程序,用来被执行
    二:模块,文件中存放着一堆功能,用来被导入使用

    python为我们内置了全局变量__name__,

    当文件被当做脚本执行时:__name__ 等于'__main__'
    当文件被当做模块导入时:__name__等于模块名
    作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
    if __name__ == '__main__':
    • 包的基本使用

    • 什么是包?

      官网解释
      包是一种通过使用‘.模块名’来组织python模块名称空间的方式。
      具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来
      需要强调的是:

        1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
        2. 创建包的目的不是为了运行,而是被导

    • 为何要用包

      ​ 包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来,随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性

    • 注意事项

      1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
      2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
      3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

    首次导入包发生的事情

    1、运行包下的__init__.py文件,创建一个包的名称空间,将__init__.py运行过程中产生的名字都丢到包的的名称空间中
    2、在当前名称空间中得到一个名字aaa,该名字是指向包名称空间
    aaa下的py文件:
    
    # m1.py    #  被导入包aaa下的py文件
    def f1():
    	print('m1,f1')
    
    # __init__.py
    from aaa import m1
    
    
    
    # run.py   # 执行文件
    
    import aaa
    
    print(aaa.m1.f1)
    aaa.m1.f1()
    
    
    • 包总结

      1、导包就是在导包下__init__.py文件
      2、包内部的导入应该使用相对导入,相对导入也只能在包内部使用,而且...取上一级不能出包
      3、使用语句中的点代表的是访问属性
      m.n.x -------> 向m要n,向n要x
      而导入语句中的点代表的是路径分隔符
      import a.b.c -----> a/b/c,文件夹下a下有子文件夹b,文件夹b下有子文件或文件夹c
      所以导入语句中点的左边必须是一个包

    • logging日志模块

    • 日志级别

    CRITICAL = 50 # 严重 critical  FATAL = CRITICAL
    ERROR = 40    # 错误 error
    WARNING = 30  # 警告 warning   WARN = WARNING
    INFO = 20     # 消息 info
    DEBUG = 10    # 调试 debug                 
    NOTSET = 0    # 不设置
    
    • logging模块的Formatter,Handler,Logger,Filter对象

      logger:产生日志的对象
      Filter:过滤日志的对象
      Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
      Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式
    • 日志配置字典

    # settings.py
    
    standard_format = '%(asctime)s %(filename)s:%(lineno)d %(name)s %(levelname)s %(message)s'
    simple_format = '%(asctime)s %(message)s'
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
        },
        'filters': {},
        'handlers': {
            #打印到文件的日志,收集info及以上的日志
            'file1': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',  # 保存到文件
                'formatter': 'standard',
                'filename': 'a1.log',
                'encoding': 'utf-8',
            },
            'file2': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',  # 保存到文件
                'formatter': 'standard',
                'filename': 'a2.log',
                'encoding': 'utf-8',
            },
            #打印到终端的日志
            'stream': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
            },
        },
        'loggers': {
            #logging.getLogger(__name__)拿到的logger配置
            '': {
                'handlers': ['file1','file2','stream'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'ERROR', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
                'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
            },
            '提示日志': {
                'handlers': ['stream'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'ERROR', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
                'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
            },
        },
    }
    
    
    • 导入logging加载settings字典,配置生成对应对象以及绑定关系

    # common.py
    
    import settings        # 导入settings拿到配置字典
    import logging.config  # 导入logging模块标准库
    
    def get_logger(name):
        logging.config.dictConfig(settings.LOGGING_DIC)
        return logging.getLogger(name)
    
    
    logger1 = get_logger("用户交易")
    logger1.debug("调试日志")
    logger1.info("egon给lxx转了1个亿")
    logger1.warning("警告")
    logger1.error("错误")
    logger1.critical("危机")
    
    logger2 = get_logger("安全相关")
    logger2.debug("调试日志")
    logger2.info("常规")
    logger2.warning("警告")
    logger2.error("egon登录失败")
    logger2.critical("危机")
    
    • 日志格式

    # al.txt
    2021-01-05 12:16:58,932 common.py:13 用户交易 ERROR 错误
    2021-01-05 12:16:58,932 common.py:14 用户交易 CRITICAL 危机
    2021-01-05 12:16:58,934 common.py:20 安全相关 ERROR egon登录失败
    2021-01-05 12:16:58,934 common.py:21 安全相关 CRITICAL 危机
    2021-01-05 16:10:38,257 common.py:13 用户交易 ERROR 错误
    2021-01-05 16:10:38,258 common.py:14 用户交易 CRITICAL 危机
    2021-01-05 16:10:38,260 common.py:20 安全相关 ERROR egon登录失败
    2021-01-05 16:10:38,260 common.py:21 安全相关 CRITICAL 危机
    
    # a2.txt
    2021-01-05 12:16:58,932 common.py:13 用户交易 ERROR 错误
    2021-01-05 12:16:58,932 common.py:14 用户交易 CRITICAL 危机
    2021-01-05 12:16:58,934 common.py:20 安全相关 ERROR egon登录失败
    2021-01-05 12:16:58,934 common.py:21 安全相关 CRITICAL 危机
    2021-01-05 16:10:38,257 common.py:13 用户交易 ERROR 错误
    2021-01-05 16:10:38,258 common.py:14 用户交易 CRITICAL 危机
    2021-01-05 16:10:38,260 common.py:20 安全相关 ERROR egon登录失败
    2021-01-05 16:10:38,260 common.py:21 安全相关 CRITICAL 危机
    
    
  • 相关阅读:
    Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享
    Shiro权限管理框架(一):Shiro的基本使用
    【自动化__持续集成】___java___finally
    【自动化__持续集成】___java___异常处理
    【自动化__持续集成】___java___static
    【自动化__持续集成】___java___对象
    【自动化__持续集成】___java___代码非空指针
    【自动化__持续集成】___java___代码空指针
    【自动化__持续集成】___java___失血模型
    【自动化__持续集成】___java___构造方法
  • 原文地址:https://www.cnblogs.com/gfeng/p/14236673.html
Copyright © 2011-2022 走看看