模块之 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 表示系统
模块之 logging, shelve, sys 模块的更多相关文章
- [xml模块、hashlib模块、subprocess模块、os与sys模块、configparser模块]
[xml模块.hashlib模块.subprocess模块.os与sys模块.configparser模块] xml模块 XML:全称 可扩展标记语言,为了能够在不同的平台间继续数据的交换,使交换的数 ...
- Python日志(logging)模块,shelve,sys模块
菜鸟学python第十七天 1.logging 模块 logging模块即日志记录模块 用途:用来记录日志 为什么要记录日志: 为了日后复查,提取有用信息 如何记录文件 直接打开文件,往里写东西 直接 ...
- python3 json、logging、sys模块
json模块 import json dic = {'name':'egon','age':32} # ------------------------------>序列化 f = open(' ...
- python标准模块(os及sys模块)
一.os模块 用于提供系统级别的操作 os.getcwd() 获取当前工作目录 os.stat('path/filename') 获取文件/目录信息,其中包括文件大小等 os.sep 获得操作系统特定 ...
- python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)
一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...
- python 常用模块之random,os,sys 模块
python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...
- Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块
一.前提介绍: 可以开辟作用域的只有类,函数,和模块 for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...
- python模块--json \ pickle \ shelve \ XML模块
一.json模块 之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,e ...
- python 全栈开发,Day27(复习, defaultdict,Counter,时间模块,random模块,sys模块)
一.复习 看下面一段代码,假如运行结果有问题,那么就需要在每一步计算时,打印一下结果 b = 1 c = 2 d = 3 a = b+c print(a) e = a + d print(e) 执行输 ...
- sys模块python
sys模块 1: sys是python自带模块. 利用 import 语句输入sys 模块. 当执行import sys后, python在 sys.path 变量中所列目录中寻找 sys 模块文件. ...
随机推荐
- Data Structure 基本概念
数据(data) 描述客观事物的数值 数据项(data item) 具有原子性,不可分割的最小单位 数据元素(data element)集合的个体,通常由很多数据组成 数据对象(data object ...
- 《剑指offer》第五十三题(0到n-1中缺失的数字)
// 面试题53(二):0到n-1中缺失的数字 // 题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字 // 都在范围0到n-1之内.在范围0到n-1的n个数字中有且只有一个数 ...
- Cordova+Vue快速搭建Hybrid App
前言 最近项目迭代需要开发一个app,由于项目组其他系统前端技术栈都是Vue,所以自己在需求评估的时候就初步敲定了Cordova+Vue的前端架构,后来查阅了不少资料,也掉了不少坑,这里总结一下,也算 ...
- 关于类、方法、对象(实例):通过一个例子看一下self都做了哪些事情
我们在定义一个类时,经常会在类的各个方法中看到self,那么在程序执行时self到底起了什么作用,什么时候要加self,这一点需要我们思考并好好理解.之前在学习时没有想这么多,加之用pycharm写代 ...
- 单细胞数据高级分析之构建成熟路径 | Identifying a maturation trajectory
其实就是另一种形式的打分. 个人点评这种方法: 这篇文章发表在nature上,有点奇怪,个人感觉创新性和重要性还不够格,工具很多,但是本文基本都是自己开发的算法(毕竟satji就是搞统计出身的). 但 ...
- 有序广播和标准广播 --Android开发
一.标准广播和有序广播也很容易理解的. 标准广播: (1)通过sendBroadcast()方法发送 (2)通过异步方式发送,广播接收者的执行顺序是不明确的 有序广播: (1)通过sendOrderB ...
- You Don't Know JS: this & Object Prototypes( 第2章 this)
this is a binding made for each function invocation, based entirely on its call-site (how the functi ...
- 父子元素select悬浮代码,兼容火狐
//公共切换方法 function SwitchCommon() { //悬浮显示 $(document.body).on("mouseenter", "[hex-eid ...
- POJ-2955 Brackets(括号匹配问题)
题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...
- wdcp环境redis的位置