day18 hash logging模块

发布时间 2023-12-10 13:46:10作者: Junior_bond

day18
2023年12月9日 周六 14:03:43

day17复习
datetime.datetime.now() 要什么文件切割就可以
random.choice([1,2,3])随机选择
random.shuffle()打乱顺序
random.random(1,2)随机取数
os.mkdir() 新建一个文件夹

os模块与操作系统交互 操作文件和文件夹
sys与py解释器交互

环境变量和文件路径的区别:(文件路径是众多环境变量的一种 用它来指定文件的位置)
我们一般使用环境变量指定一个文件夹的位置,或一个应用程序的位置等。
而path环境变量只是众多环境变量的其中一个,它的变量名叫做“path”,与其他环境变量没有什么区别,只不过“path”这个环境变量经常用到而已

sys.path()获取文件的环境变量,即模块的搜索路径

json模块:
序列化:把数据从内存保存到硬盘 只支持dict/list/str/int/float/bool
反序列化:把数据从硬盘读取到内存
跨平台 跨语言交互 保存的数据为字符串类型

pickle模块:
序列化 反序列化 什么类型的数据都可以存储
但是不能跨平台 保存的数据为二进制类型 所以open的时候要用rb wb


day18开始

hashlib模块:
加密 加密后长度一样
累加 如果使用同一个哈希编码表 不断地哈希 得到的结果是累加的哈希结果 即第一次哈希123 第二次哈希456 实际上第二次哈希的是123456
import hashlib
pwd="yjw".encode("utf8")#哈希前必须编码
print(pwd)
hashlib.md5().update(pwd)
print(hashlib.md5().hexdigest())


logging模块:
import logging
#生成一个logger
logger1=logging.getLogger("user")
logger2=logging.getLogger("bank")

#生成handler
h1=logging.FileHandler("h1.log")
h2=logging.FileHandler("h2.log")
sm=logging.StreamHandler()


#生成formatter
f1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',)

f2 = logging.Formatter('%(asctime)s : %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',)

f3 = logging.Formatter('%(name)s %(message)s',)

#绑定formatter到handler 设置输出到文件或者屏幕的格式
h1.setFormatter(f1)
h2.setFormatter(f2)
sm.setFormatter(f3)

#绑定handler到不同的logger
logger1.addHandler(h1)#user的日志输出到h1
logger2.addHandler(h2)#bank的日志输出到h2
logger2.addHandler(sm)#bank的日志也输出一份到sm

#设置输出级别
logger1.setLevel(10)
logger2.setLevel(10)
h1.setLevel(20)
#测试
logger1.info("我是info 1")
logger1.debug("a1")
logger1.warning("b1")
logger1.error("c1")
logger1.critical("d1")

logger2.info("我是info 2")
logger2.debug("a2")
logger2.warning("b2")
logger2.error("c2")
logger2.critical("d1")


logging模板

import os

import logging.config

 

# 定义三种日志输出格式 开始
s
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \

'[%(levelname)s][%(message)s]' # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行
s
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
i
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 定义日志输出格式 结束

l
logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录,需要自定义文件路径 # atm
l
logfile_dir = os.path.join(logfile_dir, 'log') # C:\Users\oldboy\Desktop\atm\log

l
logfile_name = 'log.log' # log文件名,需要自定义路径名

# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir): # C:\Users\oldboy\Desktop\atm\log
os.mkdir(logfile_dir)

 

# log文件的全路径
l
logfile_path = os.path.join(logfile_dir, logfile_name) # C:\Users\oldboy\Desktop\atm\log\log.log
# 定义日志路径 结束

# log配置字典
L
LOGGING_DIC = {

'version': 1,

'disable_existing_loggers': False,

'formatters': {

'standard': {

'format': standard_format

},

'simple': {

'format': simple_format

},

},

'filters': {}, # filter可以不定义
'handlers': {

# 打印到终端的日志
'console': {

'level': 'DEBUG',

'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},

# 打印到文件的日志,收集info及以上的日志
'default': {

'level': 'INFO',

'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',

'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M (*****)
'backupCount': 5,

'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},

},

'loggers': {

# logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
'': {

# 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'handlers': ['default', 'console'],

'level': 'DEBUG',

'propagate': False, # 向上(更高level的logger)传递
},

},
}
}

 

 

def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(__name__) # 生成一个log实例
logger.info('It works!') # 记录该文件的运行状态

return logger

 


if __name__ == '__main__':

load_my_logging_cfg()