zoukankan      html  css  js  c++  java
  • 模块之 logging, shelve, sys 模块

    一. logging模块

      用来记录日志,日志:记录某个时间点发生了什么事

      日志作用:程序调试

           了解软件程序的运行情况,是否正常

           软件程序运行故障分析与问题定位

           还可用来做用户行为分析

      日志等级:在不改动应用程序代码的情况下,实现在不同的环境记录不同详细程度的

           1. DEBUG=10   最详细的日志,应用场景为问题诊断

           2. INFO=20    通常只记录关键节点信息,用于确认一切是按照预期那样进行

           3.WARNING=30    记录一些不期望发生的事情的信息,程序可正常运行

           4. ERROR=40    由于一个严重的问题导致某些功能不能正常运行时记录的信息

           5.CRITICAL=50   当发生严重错误,导致应用程序不能继续运行时记录的信息

      日志等级排序: DEBUG<INFO<WARNING<ERROR<CRITICAL

      一条日志信息应该包括的内容: 发生时间/ 发生的位置/ 事情的严重程度(日志级别)/ 事件内容

      为某个程序制定日志级别后,应用程序会记录所有日志级别>= 制定日志级别的日志信息,同时,logging模块也可以指定日志记录器的日志级别,只有级别>= 指定日志级别的日志记录才会被输出,低等级的日志记录会别丢弃

      logging 模块提供两种记录日志的方式:

        第一种: 使用logging提供的模块级别的函数

        第二种: 使用logging日志系统的四大组件

      logging模块定义的模块级别的常用函数:

        logging.debug(msg,*args,**kwargs)  创建一条等级为DEBUG的日志记录

        logging.info(msg,*args,**kwargs)   创建一条严重级别为INFO的日志记录

        logging.warning(msg,*args,**kwargs)  创建一条严重级别为warning的日志记录

        logging.error(msg,*args,**kwargs)  创建一条严重界别为error的日志记录

        logging.critical(msg,*args,**kwargs) 创建一条严重级别为CRITICAL的日志记录

        logging.log(level,*args,**kwargs)  创建一条严重级别为level的日志记录

        logging.basicConfig(**kwargs)   对root logger 进行一次性配置(用于指定“要记录的日志级别”,日志输出位置,日志文件的打开模式)

      logging模块的四大组件:

        loggers: 提供应用程序代码直接使用的接口

        handlers: 用于将日志记录发送到指定的目的位置

        filters:用于决定哪些日志记录将会被输出

        formatters:用于控制日志信息的最终输出格式

      四大组件之间的关系:

        日志器: 需要通过处理器(handler)将日志信息输出到目标位置

        不同的处理器可以将日志输出到不同的位置

        不同的日志器可以设置多个处理器 将同一条日志记录到不同的位置

        每个处理器都可以设置自己的格式器

        总结: 日志器是入口, 处理器处理,处理器可以通过过滤器和格式器做过滤和格式化处理

    Logger类
    Logger对象有3个任务要做:
    
    1)向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息;
    2)基于日志严重等级(默认的过滤设施)或filter对象来决定要对哪些日志进行后续处理;
    3)将日志消息传送给所有感兴趣的日志handlers。
    Logger对象最常用的方法分为两类:配置方法 和 消息发送方法
    
    最常用的配置方法如下:
    
    方法    描述
    Logger.setLevel()    设置日志器将会处理的日志消息的最低严重级别
    Logger.addHandler() 和 Logger.removeHandler()    为该logger对象添加 和 移除一个handler对象
    Logger.addFilter() 和 Logger.removeFilter()    为该logger对象添加 和 移除一个filter对
    Handler类
    Handler对象的作用是(基于日志消息的level)将消息分发到handler指定的位置(文件、网络、邮件等)。Logger对象可以通过addHandler()方法为自己添加0个或者更多个handler对象。比如,一个应用程序可能想要实现以下几个日志需求:
    
    1)把所有日志都发送到一个日志文件中;
    2)把所有严重级别大于等于error的日志发送到stdout(标准输出);
    3)把所有严重级别为critical的日志发送到一个email邮件地址。
    这种场景就需要3个不同的handlers,每个handler复杂发送一个特定严重级别的日志到一个特定的位置。
    一个handler中只有非常少数的方法是需要应用开发人员去关心的。对于使用内建handler对象的应用开发人员来说,似乎唯一相关的handler方法就是下面这几个配置方法:
    
    方法    描述
    Handler.setLevel()    设置handler将会处理的日志消息的最低严重级别
    Handler.setFormatter()    为handler设置一个格式器对象
    Handler.addFilter() 和 Handler.removeFilter()    为handler添加 和 删除一个过滤器对象
    import logging
     
    logging.debug('This is a debug log.')
    logging.warning('this is a warning log.')
    
    # 相当于
    
    logging.log(logging.DEBUGE, 'this is a debug log.')
    logging.log(logging.WARNING,'this is a warnging log.')
    
    # 输出结果
    
    WARNING:root:This is a warning log.

    # 重点: 当没有提供任何配置信息的时候,这些函数都会去调logging.basicConfig(**kwargs) 且不会向该方法传递任何参数

     

    Formater类
    Formater对象用于配置日志信息的最终顺序、结构和内容。与logging.Handler基类不同的是,应用代码可以直接实例化Formatter类。另外,如果你的应用程序需要一些特殊的处理行为,也可以实现一个Formatter的子类来完成。
    
    Formatter类的构造方法定义如下:
    
    logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
    可见,该构造方法接收3个可选参数:
    
    fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
    datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
    style:Python 3.2新增的参数,可取值为 '%', '{''$',如果不指定该参数则默认使用'%'

      logging.basicConfig() 函数参数说明:

        filename: 指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了

        filemode: 指定日志文件的打开模式,默认为'a'。需要注意的是,该选项要在filename指定时才有效

        format: 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序

        datefmt: 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效

        level: 指定日志器的日志级别

        stream: 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。stream和filename不能同时提供,否则会引发 ValueError异常

        style:指定format格式字符串的风格,可取值为'%'、'{'和'$',默认为'%'

        handlers: 它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。注意:filename、stream和handlers这三个配置项只能有一个存在

      format 格式:

        

    字段/属性名称使用格式描述
    asctime %(asctime)s 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
    created %(created)f 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
    relativeCreated %(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
    msecs %(msecs)d 日志事件发生事件的毫秒部分
    levelname %(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
    levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
    name %(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
    message %(message)s 日志记录的文本内容,通过 msg % args计算得到的
    pathname %(pathname)s 调用日志记录函数的源码文件的全路径
    filename %(filename)s pathname的文件名部分,包含文件后缀
    module %(module)s filename的名称部分,不包含后缀
    lineno %(lineno)d 调用日志记录函数的源代码所在的行号
    funcName %(funcName)s 调用日志记录函数的函数名
    process %(process)d 进程ID
    processName %(processName)s 进程名称,Python 3.1新增
    thread %(thread)d 线程ID
    threadName %(thread)s 线程名称
    #配置日志输出
    import logging
    logging.basicConfig(level=logging.DEBUG

    LGO_FORMAT='%(asctime)s-%(levelname)s-%(message)s'
    DATE_FORMAT='%m/%d/%Y %H:%M:%S %p'
    logging.basicConfig(filename='mylog', level=logging.DEBUG,format=LOG_FORMAT, datefmt=DATE_FORMA

    二. shelve 模块

      用来序列化模块,只有一个open函数,用open打开一个文件当做字典来使用,自动完成序列化

      支持python的所有基础数据类型,只能被python使用

      无法跨平台使用,当程序是单机程序时可用

    s=shelve.open('test.she')
    s['name']='egon' # 打开文件,默认为一个字典,为字典增加键值对,自动将写入的内容序列化

    s=shelve.open('test.she')
    print(s['name']) # 打开文件,直接取文件中内容

    三. sys 模块

      system: 表示解释器                   os(operation system) 表示操作系统

      sys.argv  ===>  接收的是操作系统调用解释器时传入的参数(开发一款不带界面的程序,只能在终端(cmd)应用

      print(sys.srgv)  ===> 默认为文件的路径

      sys.argv 

    # 需求: 开发一个基于cmd的复制文件的工具
    # sys.argv 接收参数
    # 参数1:被执行的py文件
    # 参数2: 源文件路径
    # 参数3: 目标文件路径

      sys.exit(0)   0 表示正常退出

      sys.version  表示解释器版本

      sys.platform  表示系统

  • 相关阅读:
    excel的部分使用方法
    liist不同遍历优缺点
    oracle中rownum和rowid的区别
    Oracle中插入100万条数据
    Java中手动提交事务
    oracle 查看表是否存在、包含某字段的表、表是否包含字段
    form的一个特性
    使用oracle的保留字作为字段名称并进行操作的方法
    thinkphp不能够将ueditor中的html文本显示
    java7,java8 中HashMap和ConcurrentHashMap简介
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10090905.html
Copyright © 2011-2022 走看看