模块之 logging、hashlib、configparser
众所周知,在我们每个软件中都存在日志,有时候出现错误时需要上传日志,在python语言中,有一个logging模块,这个就是日志模块,主要记录一些信息,在logging模块中,有两种方式,第一种是函数版,另外一种是面向对象版本,先来看看函数版的简写版
import logging
logging.debug("你好")
logging.info("你好")
logging.warning("你好")
logging.error("你好")
logging.critical("你好")
在logging模块中,级别为CRITICAL>ERROR>WARNING>INFO>DEBUG,对应在数字上就是:50.40.30.20.10,我们可以手动修改一下日志等级
logging.basicConfig(level = logging.DEBUG,或者level = 10)
在默认情况下,在输出界面输出的是warning及以上的级别的日志,写出来的这个简写版日志,可以用但是不够灵活,我们可以指定一个模板来使它变得更加灵活
函数版日志模板
logging.basicConfig(
level=logging.大写 或者 level=10,20,30,40,50
format='%(asctime)s - %(name)s - [%(lineno)d] - %(message)s',
filename='test.log',
filemode='a+')
logging.debug("你好")
logging.info("你好")
logging.warning("你好")
logging.error("你好")
logging.critical("你好")
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件 (f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。format参数中可能用到的格式化串: %(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s用户输出的消息面向对象版的日志模板
import logging
生成
logger = logging.getLogger('可以命名') 获取新的日志
formatter = logging.Formatter('%(asctime)s - %(name)s - [%(lineno)d] - %(message)S')定义一个模板:输出格式
ch = logging.StreamHandler() 生成一个屏幕流
fh = logging.FileHandler('.log','a',encoding='utf-8') 生成一个文件流
boss = logging.FileHandler('boss.log','a',encoding='utf-8') 生成一个新的日志
boss_formatter = logging.Formatter('%(asctime)s-%(message)s')
绑定
ch.setFormatter(formatter) 把自己定义的模板绑定给创建的存储日志的流
fh.setFormatter(formatter)
boss.setFormatter(boss_formatter) 写一个新的模板,绑定
logger.addHandler(ch), 将屏幕流加入日志绑定
logger.addHandler(fh), 将文件流加入日志绑定
logger.addHandler(boss), 将文件流加入日志绑定
logger.setLevel(logging,DEBUG) 修改等级
logger.debug('你好')
logger.info('你好')
logger.warning('你好')
logger.error('你好')
logger.critical('你好')
函数版和面向对象版之间的区别:
函数版:写入屏幕和文件二选一,只能在一个地方显示结果,在文件中默认编码为GBK
它是python中直接定义好的,可以直接拿来用
面向对象版:写入屏幕或文件中都可以,支持多个输出方式,写入文件中的编码方式可以自定义
它是我们自己制定的,需要一步一步来操作
hashlib模块
hashlib提供了摘要算法,如md5,sha1,sha256,sha512等
md5是单向的,是不可逆的,内容会转换成32位的哈希值
import hashlib
md5 = hashlib.md5
md5.update('内容',encode('utf-8'))
print(md5.hexdigest())
md5加盐:
md5 = hashlib.md5('内容'.encode('utf-8')) 加盐
md5.update('内容',encode('utf-8'))
print(md5.hexdeigest())
sha1,长度为40,还有sha256,sha512
s = hashlib.sha1()
s.update('内容',encode('utf-8'))
print(s.hexdigest()) sha1的哈希值比md5的长,更安全
sha在文件下载时,可以检验文件的一致性
configparser 配置文件:文件+字典
import configparser
conf = configparser.Configparser()
f = open('db.ini','w')
conf['DEFAULT'] = {'session_time_out':60}
conf[186-db] = {
'IP':186.12.33.3,
'port':3306
}
conf[192-db] = {
'IP':192.168.16.23,
'port':3306
}
conf.write(f)
查:
conf.read('db.ini')
print(conf['186-db'])
print(conf['186-db']['IP'])
print(conf.get('186-db','IP'))
增:
conf.read('db.ini')
conf['186-db']['user'] = 'root'
conf.write(open('db.ini','w'))
改:
conf.read('db.ini')
conf['186-db']['user'] = 'admin'
conf.write(open('db.ini','w'))
删:
conf.read('db.ini')
del conf['186-db','user']
conf.write(open('db.ini','w'))
重组:
conf.read('db.ini')
for i in conf.sections():
print(i)

浙公网安备 33010602011771号