day18 logging模块 sys shelve
昨日回顾
re
正则表达式
匹配字符串
场景 例如:爬虫,密码规则验证,邮箱地址验证,手机号码
学习re主要学习的就是 那一堆特殊符号
hashlib
hash是一种算法 lib表示库
该模块包含了一堆的hash算法
hash接受任意长度的输入,计算后,输出一段固定长度的字符串
根据算法的不同结果的长度也不同
在算法固定的情况下,输入的数据相同,输出的结果也必然相同
hash的两个作用:
1.加密 无法被反解
2.文件校验 比对两个文件是否完全相同
常用模块
1.logging *****
翻译为日志记录
该模块用于记录日志的
1.日志是什么?
日志其实就是日记,用于记录某个时间点发生了什么事
2.为什么要记录日志?
是为了日后来复查,提取有用的信息
3.如何来记录日志?
可以直接打开文件,往里写东西
直接写入文件的两个问题:
1.你写的数据格式,别人看不懂
2.解析数据麻烦
因此logging就诞生了
logging 专门用于记录日志
日志的级别
1.debug (最底层) 调试信息(用于记录程序在开发过程中的调试记录,例如,不清楚这个变量的值,所以打印一下)
2.info 记录普通信息(没特别的意义,就是简单的记录)
3.warning 警告信息(当某些操作可能发生错误,就记录为警告信息,涉及一些安全操作时,例如删库)
4,error 错误信息(当程序遇到错误时,列入要求用户输入一个整数,他偏要输入小数,导致数据类型转换失败)
5.critical 严重错误(当程序遇到问题,无法继续执行时,例如,需要一个核心组件,然而这个组件被用户删了)
为什么分级:随着时间的推移,你的日志会越来越多,成千上万条,这时候要提取有用的信息就很慢,所有使用logging,这样一来,在查看日志的时候,可以快速的定位到想要的日志
为什么要设置最低等级,因为一些级别的日志对我是无用的
如果我们需要更详细的去定制logging的各项功能,就需要我们系统的学习一下logging这个模块
四种核心角色
1.Logger 日志生成器:负责产生一条完整的日志
2.Filter 过滤器:负责对日志进行过滤
3.Handle 处理器:负责将日志输出到指定位置
4.Formater 格式化:负责处理日志显示的格式
一条日志的生命周期
1.由Logger产生日志
2.交给过滤器进行过滤
3.交给Hanlder按照Formater的格式进行输出
这三步都可以 对日志进行筛选,什么样的需要显示,什么样的不需要显示
使用方法
import logging
# 简单的使用
logging.debug('这是一条日志信息') # 没有输出任何内容
因为logging模块为日志划分了级别,由于你输出的级别没有达到最低级别,所有没有输出
logging.info()
logging.debug()
logging.warnning()
logging.error()
logging.critical()
最低等级是warnning
logging用数字来表示级别 从低到高 0 10 20 30 40 50
#默认情况下,级别为warnning,输出的位置是控制台,默认的日志格式为 级别:日志生成器的名称:调试的信息
如何修改默认的行为
logging.basicConfig(filename="mylog.txt", # 指定的日志文件名
filemode="a", #指定的是文件打开的模式 通常为a
level=logging.DEBUG, # 指定级别
format="%(filename)s %(levelname)s %(asctime)s %(message)s",# 指定显示格式
)
需求:有一个登录注册 功能 需要记录用户操作日志,程序员需要看到最详细的信息,而boss只需要看到简单信息
#自定义四种核心觉得,完成日志的输出
#参数指定的生成器的名称(因为可以同时存在多个生成器,需要名字来加以区分)
mylog = logging.getLogger('mylog')
#设置生成器的级别,低于该级别的不会生成
mylog.setLevel(10)
# 过滤器 这里不讲 需要使用面向对象的基础知识点(不常用)
# 给程序员看的日志处理器
handler1 = logging.FileHandler("youlog.txt",encoding="utf8",)
#将处理器 绑定给生成器, add函数表明了 一个生成器可以添加多个处理器
mylog.addHandler(handler1)
# 给老板看的日志处理器
handler2 = logging.FileHandler("boss.txt",encoding="utf8",)
#将处理器 绑定给生成器, add函数表明了 一个生成器可以添加多个处理器
mylog.addHandler(handler2)
# 格式化处理器
# 程序员的格式化处理器
formater1= logging.Formatter(fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s")
# 将格式化处理器 绑定给 handler
handler1.setFormatter(formater1)
# 老板的格式化处理器
formater2= logging.Formatter(fmt="%(levelname)s %(asctime)s %(message)s")
# 将格式化处理器 绑定给 handler
handler2.setFormatter(formater2)
现在需求已经实现了,但是每次使用日志都要写这么一堆代码,最好把配置写死,直接复制已有的配置信息
# logging.config 专门用于配置logging模块
import logging.config
#导入包含配置字典的模块
import loggin_config
#通过一个字典来配置logging模块
logging.config.dictConfig(loggin_config.LOGGING_DIC)
通过名称来获取一个生成器
aaloger = logging.getLogger('aa')
aaloger.info('测试信息')
当要获取的名称不存在时,会返回一个默认的生成器
aaloger = logging.getLogger('asadafasd')
print(aaloger.name)
字典配置(重点)
字典的 内容重点,但是不需要背,
需要记住的是 如何来加载配置
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
logfile_path = "dictconfig.log"
LOGGING_DIC = {
'version': 1,
# 是否禁用已存在的生成器 这个值保持为False
'disable_existing_loggers': False,
# 四个key不能随便写 是固定
'formatters': {
# standard 表示格式化处理器的名字 相当于变量名称 可以随便写
'standard': {
# format是固定的不能随便写
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
#打印到终端的日志
#console是处理器的名称 可以随便写
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5, #日志文件最大个数
'encoding': 'utf-8', # 日志文件的编码
},
"ATM":{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': "ATMlog.txt", # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5, #日志文件最大个数
'encoding': 'utf-8', # 日志文件的编码
}
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
#aa是生成器的名称 可以随便写
# 如果将key(生成器名称)设置为空 则意味着将它作为默认的是你生成器
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递 日志的继承
},
"atm":{
'handlers': ['ATM'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递 日志的继承
}
},
}```
# 了解知识点
# 自己来定义四种核心角色
import logging
mylog = logging.getLogger("father")
mylog.setLevel(10)
handler = logging.FileHandler("father.log")
mylog.addHandler(handler)
handler.setLevel(10)
fmter = logging.Formatter(fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s")
handler.setFormatter(fmter)
# 在获取一个生成器 同时指定该生成器的父生成器是father这个生成器
sonlog = logging.getLogger("father.son")
# 需求:子生成器 的输出位置与父生成器不同 格式相同
sonhandler = logging.FileHandler("son.txt",encoding="utf8")
sonlog.addHandler(sonhandler)
sonfmt = logging.Formatter(fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s")
sonhandler.setFormatter(sonfmt)
# 继承后子生成器 可以直接使用父生成器的配置
# mylog.info("这是一条日志信息!")
# sonlog.info("这是 son 输出的日志信息!")
#子生成器 在生成一个日志时 会自动给父生成器也发一个
# 取消传递效果
sonlog.propagate = False
sonlog.info("这是 son 输出的日志信息!")
学习logging模块,是为了更方便的记录日志,不用再自己解决日志记录的问题
#### 2.sys模块 ***
是system的缩写,表示系统,指的是python的解释器
import sys
# 用于操作系统调用解释器时传入的参数
print(sys.argv) 当前文件路径,是解释器的第一个参数
给多个参数,用空格隔开
#当你要开发一款基于cmd的程序时,就需要使用这个属性了,因为一些操作系统没有界面,只能通过cmd来使用
#需求 开发一个基于cmd的复制文件的工具
第一个参数表示被执行的py文件,第二个作为源文件路径,第三个作为目标文件的路径
source_path = sys.argv[1]
target_path = sys.argv[2]
sys.exit(0) 表示正常退出
总结 sys]处理与python解释器相关的一些操作
添加环境变量 sys.path
获取调用解释器的参数 sys.argv
#### 3.shevlem模块***
用于序列化的模块:json,pickle
import shelve
shelve.open('test.she')
s.['name'] = 'egon'
s['dic'] = {'age':20}
s = shelve.open('test.she')
print(s['name'])
#shelve 模块只有一个函数,就是open用于打开一个文件,
打开以后,操作方式与字典完全一致,你可以把它当成字典,并且是自带buff的字典,可以字典给完成序列化
同样支持 python所有的基础数据类型
该模块序列化得到的数据,只能被该模块使用,其他语言没有这个模块,所以无法使用,即无法跨平台,当你写的程序是一个单机程序时,可以考虑
后期,只要涉及到数据交换,就应该使用json
day18 logging模块 sys shelve的更多相关文章
- logging模块、sys模块、shelve模块
一.logging模块 1.logging模块就是用于记录日志的,日志就是记录某个时间点,发生的事情. 2.记录日志是为了日后来复查,提取有用的信息. 3.如何去记录日志:可以直接打开文件,记录信息, ...
- shelve模块,sys模块,logging模块
1.shelve模块 用于序列化的模块,shelve模块比pickle模块简单,只有open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型. impor ...
- python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则
python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess ...
- Python基础(12)_python模块之sys模块、logging模块、序列化json模块、pickle模块、shelve模块
5.sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 ...
- Python日志(logging)模块,shelve,sys模块
菜鸟学python第十七天 1.logging 模块 logging模块即日志记录模块 用途:用来记录日志 为什么要记录日志: 为了日后复查,提取有用信息 如何记录文件 直接打开文件,往里写东西 直接 ...
- python基础——14(shelve/shutil/random/logging模块/标准流)
一.标准流 1.1.标准输入流 res = sys.stdin.read(3) 可以设置读取的字节数 print(res) res = sys.stdin.readline() print(res) ...
- s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译
时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...
- 20181207(sys,shelve,logging)
一.logging模块 logging专门用来记录日志 日志的级别分为五级,可以用数字表示,从低到高分别为: import logginglogging.info('info') #10logg ...
- Python--模块之sys模块、logging模块、序列化json模块、序列化pickle模块
sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit() sys.path 返回模块的搜索路径,初始化时使用PYTHONPA ...
随机推荐
- String和get
在ch4的作业中暴露出了我不懂的一些问题,主要是和String有关的定义和头文件以及和get有关的函数. String 在C++中如果想定义字符串型,即String a:则需要用到头文件<str ...
- 自定义界面上绘制Text,可通过拖动控制文字大小及其位置
项目地址 最近项目上有个需求,需要在一块区域中显示文字,这块区域可以拖动,也可以通过拖拽右下角来改变大小,里面的文字大小要根据区域的大小进行自适应.刚开始觉得这个需求不难,只需要一个TextView就 ...
- beego orm 时间相差八小时
使用beego框架,前端调用api插入一条数据到mysql,时间差了8个小时,fuck!!! 解决办法: 在db的url后面加上时区- dbDataSource = root:test@tcp(192 ...
- golang 操作redis 错误:failed redigo: unexpected type for String, got type int64
报错的代码: isExist,err := redis.String(conn.Do("EXISTS", key)) 这个操作返回的应该是bool类型,所有改成 isExist,e ...
- Photoshop 辅助线和标尺的使用技巧
1.拖动辅助线时按住Alt键可以在水平辅助线和垂直辅助线之间切换.按住Alt键点击一条已经存在的垂直辅助线可以把它转为水平辅助线,反之亦然. 注意:辅助线是通过从标尺中拖出而建立的,所以要确保标尺是打 ...
- JAVA版开源微信管家—JeeWx捷微3.1小程序版本发布,支持微信公众号,微信企业号,支付窗
支持小程序,JeeWx捷微3.1小程序版本发布^_^ JeeWx捷微V3.1--多触点小程序版本管理平台(支持微信公众号,微信企业号,支付窗) JeeWx捷微V3.1.0版本紧跟微信小程序更新,在原有 ...
- ORM一对多增加记录
多表操作(一对多)增加记录: 1)Bookl.objects.creat(name='python', price=77, publish_id=2) 2) pulish_obj = Publish. ...
- MySQL5.7 并行复制配置
转自:https://www.cnblogs.com/langdashu/p/6125621.html [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7 一.缘由: 某天看到主从 ...
- 剑指offer例题——裴波那契数列
编程题:大家都知道裴波那契数列,现在要求输入一个整数n,请你输出裴波那契数列的第n项(从0开始,第0项为0).n<=39 public class Solution { public int F ...
- How to Pronounce AR, ORN, etc.
How to Pronounce AR, ORN, etc. Share Tweet Share The R consonant can be really tricky. In this vide ...