模块之 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个任务要做: )向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息;
)基于日志严重等级(默认的过滤设施)或filter对象来决定要对哪些日志进行后续处理;
)将日志消息传送给所有感兴趣的日志handlers。
Logger对象最常用的方法分为两类:配置方法 和 消息发送方法 最常用的配置方法如下: 方法 描述
Logger.setLevel() 设置日志器将会处理的日志消息的最低严重级别
Logger.addHandler() 和 Logger.removeHandler() 为该logger对象添加 和 移除一个handler对象
Logger.addFilter() 和 Logger.removeFilter() 为该logger对象添加 和 移除一个filter对
Handler类
Handler对象的作用是(基于日志消息的level)将消息分发到handler指定的位置(文件、网络、邮件等)。Logger对象可以通过addHandler()方法为自己添加0个或者更多个handler对象。比如,一个应用程序可能想要实现以下几个日志需求: )把所有日志都发送到一个日志文件中;
)把所有严重级别大于等于error的日志发送到stdout(标准输出);
)把所有严重级别为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 .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  表示系统

上一篇:Linux内核启动分析过程-《Linux内核分析》week3作业


下一篇:MyBatis之四:调用存储过程含分页、输入输出参数