一. 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 表示系统