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 危机
    
    
  • 相关阅读:
    PDF文件中的Form保存问题
    Understanding IP Fragmentation
    tcp ip guide IPsec IKE
    Windows安全事件日志中的事件编号与描述
    Cisco PIX fix up and Juniper firewall FTP ALG
    很好的IPSec介绍,详细解释了IKE协商的2个阶段的作用
    virtualbox 下运行Ubuntu 8.10的分辨率和guest additions的问题。
    Fixing the ‘Do you want to display nonsecure items’ message
    windows xp 开始菜单里面所有项目右键不起作用。
    HP backup and recovery manager
  • 原文地址:https://www.cnblogs.com/gfeng/p/14236673.html
Copyright © 2011-2022 走看看