zoukankan      html  css  js  c++  java
  • 模块和包

    1. 包

    • 导入包的方式:

      • 第一种方式(直接导入):import 包名.目录名.目录名n.模块名(中间所有的目录级别都使用.来连接,最后一个名字一定是模块名);使用时把import后面的所有当作一个整体来使用
      • import project.v1.core.main
      • 第二种方式(直接导入):from 包名.目录名.目录名n import 模块名;使用时直接用模块名就可以
      • from project.v1.core import main
      • 第三种方式:绝对路径导入
        • 所有模块的导入从根目录开始
        • 根目录发生变化,包内的模块和代码也会发生变化
        • 在包内的代码调用时不会报错
        • 根目录节点的位置是由sys.path中的路径决定
        • 如果希望所有的程序都能正常运行,需要修改sys.path中的内容
      • 第四种方式:相对路径导入
        • 不用考虑当前目录的模块位置
        • 根节点发生变化,包内的模块位置不受影响
        • 在包内不能直接执行,不然会报错
        • 只能在包外调用,不用关心内部模块的导入问题
      • 第五种方式:使用*和__all__结合,利用from ... import *和__all__的相关配置来产生一种包定制
    • 包导入的常用模版:

    • import os
      import sys
      BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
      sys.path.append(BASE_DIR)
      print(sys.path)
      from core import main
      if __name__ == '__main__':
          main.starting()

    2. hashlib模块

    • 说明:摘要算法模块

    • 分类:md5、sha1、sha256、sha512

    • 过程:不可逆

    • 应用:

      • 检测文件的一致性
      • 用户加密验证
    • 加密:最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示;SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长

      • 单纯的加密方式不够安全
      • 加盐处理
      • 动态加盐
      • # md5加密方式
        import hashlib
        # 普通方式
        yy_md5 = hashlib.md5()
        yy_md5.update('liyanloveyaya'.encode('utf-8'))
        print(yy_md5.hexdigest())
        # 数据量大时,多次调用update(),最后计算的结果是一样的
        yan_md5 = hashlib.md5()
        yan_md5.update('liyan'.encode('utf-8'))
        yan_md5.update('love'.encode('utf-8'))
        yan_md5.update('yaya'.encode('utf-8'))
        print(yan_md5.hexdigest())
        # 加盐方式
        salt = 'salt'.encode('utf-8')
        yy1 = hashlib.md5()
        yy1.update(salt)
        yy1.update('yy1'.encode('utf-8'))
        print(yy1.hexdigest())
        yy2 = hashlib.md5()
        yy2.update(salt)
        yy2.update('yy2'.encode('utf-8'))
        print(yy2.hexdigest())
        # 1. 加盐可以使用复杂性的加密方式,最好用大小写字母、数字和特殊符号的组合使用
        # 2. 可以使用动态加盐的方式进行加密
        >>>
        d0fd8c4c2c0d6af33bbed2425d275a5f
        d0fd8c4c2c0d6af33bbed2425d275a5f
        808c9cb52f0a9d6cc3ad8c5d8a57217e
        c90db841561b773553232b6ec7576e23d

    3. configparse模块

    • 说明:配置文件模块

    • 作用:专门为解决一种样式的配置文件而产生的

    • # 初始化配置文件
      import configparser
      yy_config = configparser.ConfigParser()
      # 实例化配置文件
      yy_config['DEFAULT'] = {
      'default': 'config'
      }
      # DEFAULT组是默认组,可有可无
      yy_config['conf'] = {
      'ip': '10.0.0.1',
      'port': '3306',
      'username': 'yy',
      'password': '123456',
      'db_name': 'yy_db'
      }
      with open('config.ini', 'w', encoding='utf-8') as f:
      yy_config.write(f)
      >>>'config.ini文件内容' 
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      # 文件的查看操作(接上面代码)
      yy_config.read('config.ini')
      # 读取配置文件信息
      print(yy_config['conf']['ip'])
      # 查看组内一个键的值
      print(yy_config.get('conf', 'db_name'))
      # 查看组内一个键的值
      print(yy_config.options('conf'))
      # 查看组中所有的键,以列表的形式返回,也包括了默认组中的键
      print(yy_config.items('conf'))
      # 查看组中所有的键值对,键值对使用元组存储,每一对分别放在列表中返回,也包括了默认组中的键值对
      >>>
      10.0.0.1
      yy_db
      ['ip', 'port', 'username', 'password', 'db_name', 'default']
      [('default', 'config'), ('ip', '10.0.0.1'), ('port', '3306'), ('username', 'yy'), ('password', '123456'), ('db_name', 'yy_db')]
      # 文件的增加操作(接上面代码)
      yy_config.add_section('redis_config')
      # 增加组
      yy_config['conf']['db_engine'] = 'InnoDB'
      yy_config['conf']['db_prefix'] = 'yy_'
      yy_config['redis_config']['ip'] = '10.0.0.2'
      yy_config['redis_config']['port'] = '6379'
      yy_config['redis_config']['auth'] = 'redis_password'
      # 增加组内的配置
      yy_config.write(open('config.ini', 'w'))
      # 文件操作增加完默认保存在内存中,需要使用写文件的操作保存操作结果
      >>>'config.ini文件内容'
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      db_engine = InnoDB
      db_prefix = yy_
      [redis_config]
      ip = 10.0.0.2
      port = 6379
      auth = redis_password
      # 文件的修改操作(接上面代码)
      yy_config.set('redis_config', 'auth', 'REDIS_Passw0rd')
      # 修改组内键对应的值
      yy_config.write(open('config.ini', 'w'))
      >>>'config.ini文件内容'
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      db_engine = InnoDB
      db_prefix = yy_
      [redis_config]
      ip = 10.0.0.2
      port = 6379
      auth = REDIS_Passw0rd
      # 文件的删除操作(接上面代码)
      yy_config.remove_section('redis_config')
      # 删除整个组
      yy_config.remove_option('conf', 'db_prefix')
      # 删除组内指定的键值对
      yy_config.write(open('config.ini', 'w'))
      >>>'config.ini文件内容'
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      db_engine = InnoDB

    4. logging模块

    • 说明:日志模块

    • 日志的描述:把程序运行的过程输出到屏幕或文件中记录,叫日志

    • 日志级别(顺序是从上到下一级比一级严格):

      • logging.debug (调试模式)
      • logging.info (信息模式)
      • logging.warning (警告模式)
      • logging.error (错误模式)
      • logging.critical (批判模式)
    • 设置日志级别:

      • 默认设置全局输出的日志级别为debug模式:logger.setLevel(logging.Debug)
      • 设置单个文件流或屏幕流的日志级别位debug模式:句柄名称.setLevel(logging.Debug)
    • 简单模式:

      • 配置简单,直接可以使用
      • 无法同时输出多个地方
      • import logging
        logging.basicConfig(
        level=logging.INFO,
        # 日志级别
        format='[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]',
        # 日志输出格式(时间格式化、程序文件名、程序在文件中的行数、日至级别、日志描述信息)
        datefmt='%Y-%m-%d %H:%M:%S',
        # 日志的时间格式
        filename='logging.log',
        # 输出存储日志的文件名
        filemode='a',
        # 日志文件的打开模式
        )
        logging.debug('debug_message...')
        logging.info('info_message...')
        logging.warning('warning_message...')
        logging.error('error_message...')
        logging.critical('critical_message...')
        >>>'logging.log文件内容'
        [2017-11-23 16:42:55] [yan27.py] [line:57] [INFO] [info_message...]
        [2017-11-23 16:42:55] [yan27.py] [line:58] [WARNING] [warning_message...]
        [2017-11-23 16:42:55] [yan27.py] [line:59] [ERROR] [error_message...]
        [2017-11-23 16:42:55] [yan27.py] [line:60] [CRITICAL] [critical_message...]
    • logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,常用的参数有:

      • level:设置日志级别
      • format:设置日志显示格式
      • datefmt:设置日期时间格式
      • filename:指定日志输出的文件名,不指定输出到终端
      • filemode:指定日志文件的打开模式
      • stream:指定输出终端(默认的输出方式),如果指定了filename,则stream不生效
    • 日志显示格式的格式化串:
      • %(name)s Logger的名字
      • %(levelno)s 数字形式的日志级别
      • %(levelname)s 文本形式的日志级别
      • %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
      • %(filename)s 调用日志输出函数的模块的文件名
      • %(module)s 调用日志输出函数的模块名
      • %(funcName)s 调用日志输出函数的函数名
      • %(lineno)d 调用日志输出函数的语句所在的代码行
      • %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
      • %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
      • %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
      • %(thread)d 线程ID。可能没有
      • %(threadName)s 线程名。可能没有
      • %(process)d 进程ID。可能没有
      • %(message)s用户输出的消息
    • 高级模式

      • 支持同时输出到多个地方
      • 可以配置多地存储方式
      • import logging
        yy_Logger = logging.getLogger()
        yy_Logger.setLevel(logging.INFO)
        # 设置日志级别
        # 实例化对象
        f1 = logging.FileHandler('logging1.log', encoding='utf-8')
        # 创建文件句柄
        format1 = logging.Formatter('[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]')
        # 指定日志输出格式
        f1.setFormatter(format1)
        # 关联文件句柄和日至格式
        yy_Logger.addHandler(f1)
        # 添加文件句柄到对象中
        f2 = logging.FileHandler('logging2.log', encoding='utf-8')
        format2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        f2.setFormatter(format2)
        yy_Logger.addHandler(f2)
        s1 = logging.StreamHandler()
        # 创建屏幕流对象
        stream_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        s1.setFormatter(stream_format)
        yy_Logger.addHandler(s1)
        logging.debug('debug_message...')
        logging.info('info_message...')
        logging.warning('warning_message...')
        logging.error('error_message...')
        logging.critical('critical_message...')
        >>>'终端输出内容'
        2017-11-23 17:04:48,471 - root - INFO - info_message...
        2017-11-23 17:04:48,471 - root - WARNING - warning_message...
        2017-11-23 17:04:48,471 - root - ERROR - error_message...
        2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
        >>>'logging1.log文件内容'
        [2017-11-23 17:04:48,471] [yan27.py] [line:90] [INFO] [info_message...]
        [2017-11-23 17:04:48,471] [yan27.py] [line:91] [WARNING] [warning_message...]
        [2017-11-23 17:04:48,471] [yan27.py] [line:92] [ERROR] [error_message...]
        [2017-11-23 17:04:48,471] [yan27.py] [line:93] [CRITICAL] [critical_message...]
        >>>'logging2.log文件内容'
        2017-11-23 17:04:48,471 - root - INFO - info_message...
        2017-11-23 17:04:48,471 - root - WARNING - warning_message...
        2017-11-23 17:04:48,471 - root - ERROR - error_message...
        2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
    • 组件:

      • Logger:提供应用程序可直接使用的接口
      • Handler:指定日志输出的目的地
      • Filter:提供过滤日志信息的方法
      • Formatter:指定日志显示格式

    1. 包

    • 导入包的方式:

      • 第一种方式(直接导入):import 包名.目录名.目录名n.模块名(中间所有的目录级别都使用.来连接,最后一个名字一定是模块名);使用时把import后面的所有当作一个整体来使用
        import project.v1.core.main
      • 第二种方式(直接导入):from 包名.目录名.目录名n import 模块名;使用时直接用模块名就可以
        from project.v1.core import main
      • 第三种方式:绝对路径导入
        • 所有模块的导入从根目录开始
        • 根目录发生变化,包内的模块和代码也会发生变化
        • 在包内的代码调用时不会报错
        • 根目录节点的位置是由sys.path中的路径决定
        • 如果希望所有的程序都能正常运行,需要修改sys.path中的内容
      • 第四种方式:相对路径导入
        • 不用考虑当前目录的模块位置
        • 根节点发生变化,包内的模块位置不受影响
        • 在包内不能直接执行,不然会报错
        • 只能在包外调用,不用关心内部模块的导入问题
      • 第五种方式:使用*和__all__结合,利用from ... import *和__all__的相关配置来产生一种包定制
    • 包导入的常用模版:

      import os
      import sys
      BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
      sys.path.append(BASE_DIR)
      print(sys.path)
      from core import main
      if __name__ == '__main__':
          main.starting()

    2. hashlib模块

    • 说明:摘要算法模块

    • 分类:md5、sha1、sha256、sha512

    • 过程:不可逆

    • 应用:

      • 检测文件的一致性
      • 用户加密验证
    • 加密:最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示;SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长

      • 单纯的加密方式不够安全
      • 加盐处理
      • 动态加盐
        # md5加密方式
        import hashlib
        # 普通方式
        yy_md5 = hashlib.md5()
        yy_md5.update('liyanloveyaya'.encode('utf-8'))
        print(yy_md5.hexdigest())
        # 数据量大时,多次调用update(),最后计算的结果是一样的
        yan_md5 = hashlib.md5()
        yan_md5.update('liyan'.encode('utf-8'))
        yan_md5.update('love'.encode('utf-8'))
        yan_md5.update('yaya'.encode('utf-8'))
        print(yan_md5.hexdigest())
        # 加盐方式
        salt = 'salt'.encode('utf-8')
        yy1 = hashlib.md5()
        yy1.update(salt)
        yy1.update('yy1'.encode('utf-8'))
        print(yy1.hexdigest())
        yy2 = hashlib.md5()
        yy2.update(salt)
        yy2.update('yy2'.encode('utf-8'))
        print(yy2.hexdigest())
        # 1. 加盐可以使用复杂性的加密方式,最好用大小写字母、数字和特殊符号的组合使用
        # 2. 可以使用动态加盐的方式进行加密
        >>>
        d0fd8c4c2c0d6af33bbed2425d275a5f
        d0fd8c4c2c0d6af33bbed2425d275a5f
        808c9cb52f0a9d6cc3ad8c5d8a57217e
        c90db841561b773553232b6ec7576e23d
        # sha1加密方式
        import hashlib
        yy_sha1 = hashlib.sha1()
        yy_sha1.update('liyanloveyaya'.encode('utf-8'))
        print(yy_sha1.hexdigest())
        yan_sha1 = hashlib.sha1()
        yan_sha1.update('liyan'.encode('utf-8'))
        yan_sha1.update('love'.encode('utf-8'))
        yan_sha1.update('yaya'.encode('utf-8'))
        print(yan_sha1.hexdigest())
        salt = 'salt'.encode('utf-8')
        yy1 = hashlib.sha1()
        yy1.update(salt)
        yy1.update('yy1'.encode('utf-8'))
        print(yy1.hexdigest())
        yy2 = hashlib.sha1()
        yy2.update(salt)
        yy2.update('yy2'.encode('utf-8'))
        print(yy2.hexdigest())
        >>>
        cb15dcc3b29d8a38779f1968aa294790ae13729c
        cb15dcc3b29d8a38779f1968aa294790ae13729c
        063737cfa77f3e8fe7d530646302a09738f64db4
        55238a894d69ad3ae13a4dc0bb671ab7bc51df58

    3. configparse模块

    • 说明:配置文件模块

    • 作用:专门为解决一种样式的配置文件而产生的

      # 初始化配置文件
      import configparser
      yy_config = configparser.ConfigParser()
      # 实例化配置文件
      yy_config['DEFAULT'] = {
      'default': 'config'
      }
      # DEFAULT组是默认组,可有可无
      yy_config['conf'] = {
      'ip': '10.0.0.1',
      'port': '3306',
      'username': 'yy',
      'password': '123456',
      'db_name': 'yy_db'
      }
      with open('config.ini', 'w', encoding='utf-8') as f:
      yy_config.write(f)
      >>>'config.ini文件内容' 
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      # 文件的查看操作(接上面代码)
      yy_config.read('config.ini')
      # 读取配置文件信息
      print(yy_config['conf']['ip'])
      # 查看组内一个键的值
      print(yy_config.get('conf', 'db_name'))
      # 查看组内一个键的值
      print(yy_config.options('conf'))
      # 查看组中所有的键,以列表的形式返回,也包括了默认组中的键
      print(yy_config.items('conf'))
      # 查看组中所有的键值对,键值对使用元组存储,每一对分别放在列表中返回,也包括了默认组中的键值对
      >>>
      10.0.0.1
      yy_db
      ['ip', 'port', 'username', 'password', 'db_name', 'default']
      [('default', 'config'), ('ip', '10.0.0.1'), ('port', '3306'), ('username', 'yy'), ('password', '123456'), ('db_name', 'yy_db')]
      # 文件的增加操作(接上面代码)
      yy_config.add_section('redis_config')
      # 增加组
      yy_config['conf']['db_engine'] = 'InnoDB'
      yy_config['conf']['db_prefix'] = 'yy_'
      yy_config['redis_config']['ip'] = '10.0.0.2'
      yy_config['redis_config']['port'] = '6379'
      yy_config['redis_config']['auth'] = 'redis_password'
      # 增加组内的配置
      yy_config.write(open('config.ini', 'w'))
      # 文件操作增加完默认保存在内存中,需要使用写文件的操作保存操作结果
      >>>'config.ini文件内容'
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      db_engine = InnoDB
      db_prefix = yy_
      [redis_config]
      ip = 10.0.0.2
      port = 6379
      auth = redis_password
      # 文件的修改操作(接上面代码)
      yy_config.set('redis_config', 'auth', 'REDIS_Passw0rd')
      # 修改组内键对应的值
      yy_config.write(open('config.ini', 'w'))
      >>>'config.ini文件内容'
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      db_engine = InnoDB
      db_prefix = yy_
      [redis_config]
      ip = 10.0.0.2
      port = 6379
      auth = REDIS_Passw0rd
      # 文件的删除操作(接上面代码)
      yy_config.remove_section('redis_config')
      # 删除整个组
      yy_config.remove_option('conf', 'db_prefix')
      # 删除组内指定的键值对
      yy_config.write(open('config.ini', 'w'))
      >>>'config.ini文件内容'
      [DEFAULT]
      default = config
      [conf]
      ip = 10.0.0.1
      port = 3306
      username = yy
      password = 123456
      db_name = yy_db
      db_engine = InnoDB

    4. logging模块

    • 说明:日志模块

    • 日志的描述:把程序运行的过程输出到屏幕或文件中记录,叫日志

    • 日志级别(顺序是从上到下一级比一级严格):

      • logging.debug (调试模式)
      • logging.info (信息模式)
      • logging.warning (警告模式)
      • logging.error (错误模式)
      • logging.critical (批判模式)
    • 设置日志级别:

      • 默认设置全局输出的日志级别为debug模式:logger.setLevel(logging.Debug)
      • 设置单个文件流或屏幕流的日志级别位debug模式:句柄名称.setLevel(logging.Debug)
    • 简单模式:

      • 配置简单,直接可以使用
      • 无法同时输出多个地方
        import logging
        logging.basicConfig(
        level=logging.INFO,
        # 日志级别
        format='[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]',
        # 日志输出格式(时间格式化、程序文件名、程序在文件中的行数、日至级别、日志描述信息)
        datefmt='%Y-%m-%d %H:%M:%S',
        # 日志的时间格式
        filename='logging.log',
        # 输出存储日志的文件名
        filemode='a',
        # 日志文件的打开模式
        )
        logging.debug('debug_message...')
        logging.info('info_message...')
        logging.warning('warning_message...')
        logging.error('error_message...')
        logging.critical('critical_message...')
        >>>'logging.log文件内容'
        [2017-11-23 16:42:55] [yan27.py] [line:57] [INFO] [info_message...]
        [2017-11-23 16:42:55] [yan27.py] [line:58] [WARNING] [warning_message...]
        [2017-11-23 16:42:55] [yan27.py] [line:59] [ERROR] [error_message...]
        [2017-11-23 16:42:55] [yan27.py] [line:60] [CRITICAL] [critical_message...]
    • logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,常用的参数有:

      • level:设置日志级别
      • format:设置日志显示格式
      • datefmt:设置日期时间格式
      • filename:指定日志输出的文件名,不指定输出到终端
      • filemode:指定日志文件的打开模式
      • stream:指定输出终端(默认的输出方式),如果指定了filename,则stream不生效
    • 日志显示格式的格式化串:
      • %(name)s Logger的名字
      • %(levelno)s 数字形式的日志级别
      • %(levelname)s 文本形式的日志级别
      • %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
      • %(filename)s 调用日志输出函数的模块的文件名
      • %(module)s 调用日志输出函数的模块名
      • %(funcName)s 调用日志输出函数的函数名
      • %(lineno)d 调用日志输出函数的语句所在的代码行
      • %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
      • %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
      • %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
      • %(thread)d 线程ID。可能没有
      • %(threadName)s 线程名。可能没有
      • %(process)d 进程ID。可能没有
      • %(message)s用户输出的消息
    • 高级模式

      • 支持同时输出到多个地方
      • 可以配置多地存储方式
        import logging
        yy_Logger = logging.getLogger()
        yy_Logger.setLevel(logging.INFO)
        # 设置日志级别
        # 实例化对象
        f1 = logging.FileHandler('logging1.log', encoding='utf-8')
        # 创建文件句柄
        format1 = logging.Formatter('[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]')
        # 指定日志输出格式
        f1.setFormatter(format1)
        # 关联文件句柄和日至格式
        yy_Logger.addHandler(f1)
        # 添加文件句柄到对象中
        f2 = logging.FileHandler('logging2.log', encoding='utf-8')
        format2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        f2.setFormatter(format2)
        yy_Logger.addHandler(f2)
        s1 = logging.StreamHandler()
        # 创建屏幕流对象
        stream_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        s1.setFormatter(stream_format)
        yy_Logger.addHandler(s1)
        logging.debug('debug_message...')
        logging.info('info_message...')
        logging.warning('warning_message...')
        logging.error('error_message...')
        logging.critical('critical_message...')
        >>>'终端输出内容'
        2017-11-23 17:04:48,471 - root - INFO - info_message...
        2017-11-23 17:04:48,471 - root - WARNING - warning_message...
        2017-11-23 17:04:48,471 - root - ERROR - error_message...
        2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
        >>>'logging1.log文件内容'
        [2017-11-23 17:04:48,471] [yan27.py] [line:90] [INFO] [info_message...]
        [2017-11-23 17:04:48,471] [yan27.py] [line:91] [WARNING] [warning_message...]
        [2017-11-23 17:04:48,471] [yan27.py] [line:92] [ERROR] [error_message...]
        [2017-11-23 17:04:48,471] [yan27.py] [line:93] [CRITICAL] [critical_message...]
        >>>'logging2.log文件内容'
        2017-11-23 17:04:48,471 - root - INFO - info_message...
        2017-11-23 17:04:48,471 - root - WARNING - warning_message...
        2017-11-23 17:04:48,471 - root - ERROR - error_message...
        2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
    • 组件:

      • Logger:提供应用程序可直接使用的接口
      • Handler:指定日志输出的目的地
      • Filter:提供过滤日志信息的方法
      • Formatter:指定日志显示格式
  • 相关阅读:
    C++中static_cast, dynamic_cast使用方法
    JavaScript中的Boolean 方法与Number方法
    參数预计:最大似然预计、贝叶斯预计与最大后验预计
    漫谈程序控制流
    怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)
    Unity3d修炼之路:GUIbutton简单使用,完毕对一个简单对象Cube的移动,旋转
    Python写自己主动化之邮件发送(匿名)
    LintCode
    缓存之 ACache
    Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes
  • 原文地址:https://www.cnblogs.com/hzhcdhm/p/7886464.html
Copyright © 2011-2022 走看看