一起学Python-抛弃print,教你如何利用logging模块去写带有运行日志的程序脚本

it2025-04-30  10

前言:

无论是工作还是学习中,排查程序错误的主要手段往往是通过程序的运行日志去查看,无论是开发,还是运维。也许会有小伙伴对程序运行日志的生成感到神奇(在写这个之前我也感觉很高大上),那等你看完本文你也能做出来了。

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月底还没更新的话可以给我留言!

最新回复(0)