Python之日志logging模块
hashlib模块
加密:将明文数据通过一系列算法变成加密文数据(目的是为了让数据更加安全)
加密算法:md系列,sha系列,base系列,hmac系列
1 import hashlib 2 3 # 先确定算法类型(md5普遍使用) 4 md5 = hashlib.md5() 5 # 将明文数据传递给md5算法(update只能接受bytes类型数据) 6 md5.update(b'123') 7 # 获取加密之后的密文数据(没有规则的一连串数据) 8 res = md5.hexdigest() 9 print(res)
加密之后的密文数据是没有办法反解密成明文数据的。
市面上的破解其实就是提前算出一系列明文对应的密文,之后对比密文获取明文。
①明文数据是要相同,那么无论如何传递加密结果肯定是一样的
1 # 1.先确定算法类型(md5普遍使用) 2 md5 = hashlib.md5() 3 # 2.将明文数据传递给md5算法(update只能接受bytes数据类型) 4 md5.update(b'hellojason123') 5 res = md5.hexdigest() 6 print(res) # 4bd388611b31c548eedef14b16c9868c 7 md5.update(b'hello') 8 md5.update(b'jason') 9 md5.update(b'123') 10 res1 = md5.hexdigest() 11 print(res1) # 4bd388611b31c548eedef14b16c9868c
②明文数据越长表示内部对应的算法越复杂,越难被正向破解。
1 # 先确定算法类型(md5普遍使用) 2 md5 = hashlib.sha1() 3 # 再通过明文数据传递给md5算法(update只能接受bytes) 4 md5.update(b'helloword123') 5 res = md5.hexdigest() 6 print(res) # 0c2666238e9f1e65a17f2611285ce95c059d9a76
密文越长表示算法越发越复杂 对应的破解算法难度越高,同时越复杂的算法需要的消耗的资源就越多,密文越长基于网络发送的需要占用的数据就越大。
③涉及到用户密码存储,其实都是密文,只要用户自己知道铭文是什么
1 """ 2 1.内部程序员无法得知明文数据 3 2.数据泄露也无法得知明文数据 4 ATM购物车练习 用户密码采取的就是密文存取 5 """
④加盐处理
1 # 在对明文数据加密处理过程前添一些干扰项 2 # 先确定使用的算法(md5最普遍) 3 md5 = hashlib.md5() 4 # 将明文数据传递给md5 5 md5.update(b'helloword') 6 # 加盐(干扰项) 7 md5.update('公司内部自己定义的盐'.encode('utf8')) 8 # 真实数据 9 md5.update('12345'.encode('utf8')) 10 # 获取加密后的密文数据(没有规则的一串随机数) 11 res = md5.hexdigest() 12 print(res)
⑤动态加盐
1 """ 2 在对明文数据做加密处理过程前添加一些变化的干扰项 3 """ 4 import hashlib 5 # 1.先确定算法类型(md5普遍使用) 6 md5 = hashlib.md5() 7 # 2.将明文数据传递给md5算法(update只能接受bytes类型数据) 8 md5.update('123'.encode('utf8')) 9 # 加盐(干扰项) 10 md5.update('公司内部自己定义的盐'.encode('utf8')) 11 # 动态加盐(干扰项) 当前时间 用户名的部分 uuid(随机字符串(永远不会重复)) 12 import time 13 res1 = str(time.time()) 14 md5.update(res1.encode('utf8')) 15 # 真实数据 16 md5.update(b'hellojason123') 17 # 3.获取加密之后的密文数据(没有规则的一串随机字符串) 18 res = md5.hexdigest() 19 print(res) # 4326fe1839d7c4186900eb2b356d4f8a
⑥检校文件一致性
1 import hashlib 2 3 md5 = hashlib.md5() 4 with open(r'a.txt', 'rb') as f: 5 for line in f: 6 md5.update(line) 7 real_data = md5.hexdigest() 8 print(real_data)
logging日志模块
1 import logging 2 # 日志有五个等级(从上往下重要程度不同) 3 logging.debug('debug级别') # 10 4 logging.info('info级别') # 20 5 logging.warning('warning') # 30 6 logging.error('error级别') # 40 7 logging.critical('critical级别') # 50 8 '''默认记录的级别在30 及以上'''
1 # 简单使用 2 file_handler = logging.FileHandler(filename='x1.log', made='a', encoding='utf8') 3 logging.basicConfig( 4 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 5 datefmt='%Y-%m-%d %H:%M:%S %p', 6 handlers=[file_handler, ], 7 level=logging.ERROR) 8 logging.error('好好学习,天天向上') 9 """ 10 1.如何控制日志输入的位置 11 想在文件和终端中同时打印 12 2.不同位置如何做到不同的日志格式 13 文件详细一些 终端简单一些 14 """
日志模块详细介绍
1 # 日志有五个等级(从上往下重要程度不同) 2 logging.debug('debug级别') # 10 3 logging.info('info级别') # 20 4 logging.warning('warning') # 30 5 logging.error('error级别') # 40 6 logging.critical('critical级别') # 50 7 '''默认记录的级别在30 及以上''' 8 9 # 简单使用 10 file_handler = logging.FileHandler(filename='x1.log', made='a', encoding='utf8') 11 logging.basicConfig( 12 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 13 datefmt='%Y-%m-%d %H:%M:%S %p', 14 handlers=[file_handler, ], 15 level=logging.ERROR) 16 logging.error('好好学习,天天向上') 17 """ 18 1.如何控制日志输入的位置 19 想在文件和终端中同时打印 20 2.不同位置如何做到不同的日志格式 21 文件详细一些 终端简单一些 22 """ 23 24 import logging 25 26 # logging:负责产生日志 27 logger = logging.getLogger('转账记录') 28 # handler对象:负责日志的产生的位置 29 hd1 = logging.FileHandler('xx.log', encoding='utf8') 30 hd2 = logging.FileHandler('xx.log', encoding='utf8') # 产生的结果到文件 31 hd3 = logging.FileHandler('xx.log', encoding='utf8') 32 # formatter负责日志的格式 33 fm1 = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 34 datefmt='%Y-%m-%d %H:%M:%S %p', ) 35 fm2 = logging.Formatter(fmt='%(asctime)s - %(name)s %(message)s', 36 datefmt='%Y-%m-%d', ) 37 38 # 5.绑定handler对象 39 logger.addHandler(hd1) 40 logger.addHandler(hd2) 41 logger.addHandler(hd3) 42 # 6.绑定formatter对象 43 hd1.setFormatter(fm1) 44 hd2.setFormatter(fm2) 45 hd3.setFormatter(fm1) 46 # 7.设置日志等级 47 logger.setLevel(30) 48 # 8.记录日志 49 logger.debug('好好学习,天天向上')
配置字典
1 # 核心就在于CV 2 import logging 3 import logging.config 4 5 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ 6 '[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字 7 8 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' 9 10 logfile_path = 'a3.log' 11 # log配置字典 12 LOGGING_DIC = { 13 'version': 1, 14 'disable_existing_loggers': False, 15 'formatters': { 16 'standard': { 17 'format': standard_format 18 }, 19 'simple': { 20 'format': simple_format 21 }, 22 }, 23 'filters': {}, # 过滤日志 24 'handlers': { 25 # 打印到终端的日志 26 'console': { 27 'level': 'DEBUG', 28 'class': 'logging.StreamHandler', # 打印到屏幕 29 'formatter': 'simple' 30 }, 31 # 打印到文件的日志,收集info及以上的日志 32 'default': { 33 'level': 'DEBUG', 34 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 35 'formatter': 'standard', 36 'filename': logfile_path, # 日志文件 37 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M 38 'backupCount': 5, 39 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 40 }, 41 }, 42 'loggers': { 43 # logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志 44 '': { 45 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 46 'level': 'DEBUG', 47 'propagate': True, # 向上(更高level的logger)传递 48 }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置 49 }, 50 } 51 52 # 使用配置字典 53 logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置 54 logger1 = logging.getLogger('xxx') 55 logger1.debug('好好学习')
第三方模块
1 # 并不是python自带的 需要基于网络下载!!! 2 3 '''pip所在的路径添加环境变量''' 4 下载第三方模块的方式 5 方式1:命令行借助于pip工具 6 pip3 install 模块名 # 不知道版本默认是最新版 7 pip3 install 模块名==版本号 # 指定版本下载 8 pip3 install 模块名 -i 仓库地址 # 临时切换 9 '''命令行形式永久修改需要修改python解释器源文件''' 10 方式2:pycharm快捷方式 11 settings 12 project 13 project interprter 14 双击或者加号 15 点击右下方manage管理添加源地址即可 16 # 下载完第三方模块之后 还是使用import或from import句式导入使用 17 """ 18 pip命令默认下载的渠道是国外的python官网(有时候会非常的慢) 19 我们可以切换下载的源(仓库) 20 (1)阿里云 http://mirrors.aliyun.com/pypi/simple/ 21 (2)豆瓣 http://pypi.douban.com/simple/ 22 (3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 23 (4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/ 24 (5)华中科技大学http://pypi.hustunique.com/ 25 26 pip3 install openpyxl -i http://mirrors.aliyun.com/pypi/simple/ 27 """ 28 29 30 """ 31 下载第三方模块可能报错的情况及解决措施 32 1.报错的提示信息中含有关键字timeout 33 原因:网络不稳定 34 措施:再次尝试 或者切换更加稳定的网络 35 2.找不到pip命令 36 环境变量问题 37 3.没有任何的关键字 不同的模块报不同的错 38 原因:模块需要特定的计算机环境 39 措施:拷贝报错信息 打开浏览器 百度搜索即可 40 pip下载某个模块报错错误信息 41 """