前言:
无论是工作还是学习中,排查程序错误的主要手段往往是通过程序的运行日志去查看,无论是开发,还是运维。也许会有小伙伴对程序运行日志的生成感到神奇(在写这个之前我也感觉很高大上),那等你看完本文你也能做出来了。
1、场景模拟
按照惯例,先来个场景模拟。
1.1、场景设计
假设产品经理要求写一个不算很长的Python脚本,主要作用是判断一个文件是否存在,代码内容如下:
import logging
import os
f = 't.txt'
if os.path.exists(f):
print("文件[%s]已存在" %f)
else:
print("文件[%s]未找到" %f)
然后试着执行,没问题。
但是这时候,新需求来了,产品经理要求判断N个文件是否存在,听那语气应该是挺多的,那该怎么办呢?
1.2、解决N个文件判断
大家可能会想,这个不是洒洒水吗?直接这样写:
import logging
import os
def check_file(f):
if os.path.exists(f):
print("文件[%s]已存在" %f)
else:
print("文件[%s]未找到" %f)
file_list = ['a.txt', 'b.txt', 'c.txt']
for i in file_list:
check_file(f=i)
然后运行,成功实现需求(这里不深究文件传入方式)
如果你拿这个代码去提交,肯定会被骂一顿,为啥呢?因为起码有两个重要的点没有考虑:
- 打包检测结果
- 检测量
设想一下,如果你需要跑一万个文件的时候,你怎么给一个数据人家?
1.3、完美方案
俗话说脑子不如烂笔头,你总不能在检测完成之后再去背下检测结果或者去复制结果吧,那么既然如此,不如在执行每一个判断的时候都进行一个记录,省时省力。
1.3.1、使用logging进行运行时记录
理论我就先不讲了,代码如下:
import logging
import os
logger = logging.getLogger()
logger.setLevel('DEBUG')
BASIC_FORMAT = "%(asctime)s:%(levelname)s:%(message)s"
DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(BASIC_FORMAT, DATE_FORMAT)
chlr = logging.StreamHandler() # 输出到控制台的handler
chlr.setFormatter(formatter)
chlr.setLevel('DEBUG') # 也可以不设置,不设置就默认用logger的level
fhlr = logging.FileHandler('run.txt') # 输出到文件的handler
fhlr.setFormatter(formatter)
logger.addHandler(chlr)
logger.addHandler(fhlr)
def check_file(f):
if os.path.exists(f):
log = ("文件 [%s] 已存在" %f)
logger.info(log)
else:
err = ("文件[%s]未找到" %f)
logger.error(err)
file_list = ['a.txt', 'b.txt', 'c.txt', 'run.txt']
for i in file_list:
check_file(f=i)
运行结果:
然而你想就这样提交上去,那还是会被经理骂你,因为考虑的不够彻底。
时间不早了,该休息了,如果2020年10月底还没更新的话可以给我留言!