CSDN的查看链接:https://blog.csdn.net/zsh773992554/article/details/86022757
最近复习了一下关于日志模块,之前我们做的只要是项目,日志一定是不可缺失的,因为对于非程序开发人员,要想判断程序是否正常运行的必要条件就是查看日志。所以这个对于用户和运维测试的人员是重中之重,当然开发人员在开发过程中也是看日志过来的,不过一般的IDE都有自己的输出平台,所以报错信息都可以直接看的。当然直接用text开发的大佬请忽视我这种菜鸟的观念
我之前有过一段时间运维的经验,所以知道一个程序的log文件如果没有弄好是多么的"恶心",面对这一个.txt或者.log等后缀却有着4G大小的log文件,坦然说如果开发人员在,我保证不打死他 ["打残应该可以的"] 。因为运维的电脑配置一般都不是很好,所以每次开个log,能开到我死机。然后面对这里面一大堆的时间字符,以及乱七八糟的奇怪说明以及鬼都不知道是报错还是警告的玩意看起。倘然你可以说经验的老司机一看就知道,但是老司机的熬练过程很烦躁的,如果log规范些,并且报的东西实际意义大一些,不是什么玩意都报是不是对大家都是一件好事呢?
好了,话题扯的太远,收一下。回到本次主题就是在python中的logging模块。
概述:日志是记录着某些软件在运行时所有发生的事件
作用:通过log分析,能够方便用户了解系统、应用的运行情况。
总结为以下几点
1.程序调试
2.连接软件程序运行情况,是否正常
3.软件程序运行的故障分析和问题定位
4.如果信息详细丰富,可以做来用户行为分析
不同环境下的日志
在软件开发或部署环境时,日志内容应该是尽可能的详细,这样能够帮助开发运维人员查看应用程序的运行状态,以及在各个不同环境下的情况。然后我们将所有的运行日志记录分析,以确保后续的环境配置进行更新。但这是非常消耗机器性能的
正式发布或者生产环境部署程序时,通常只是需要记录应用的异常和错误信息,类似程序崩溃,数据访问失败等。这样可以减小服务器的I/O访问压力,也能够方便故障排查
那么这个时候就是日志等级的体现了。
FATAL/CRITICAL = 重大的,危险的
【如果你不能及时发现和处理,你就可以走人的信息,一般1-2小时内发现,4小时内处理】
ERROR = 错误
【会导致程序出现闪退或者是无法正常使用的信息,一般2-4小时内发现,8小时内处理】
WARNING = 警告
【一般是内存不够,或者链接异常等问题,一般6-8小时内发现,24小时内处理】
INFO = 信息
【运行里的信息显示,每次运行的记录】
DEBUG = 调试
【主要用于开发人员使用】
NOTSET = 没有设置
【如果你想掩耳盗铃,且留个大坑。但一般没人会这样做,损人不利己】
日志信息与格式
日志信息除了本身程序的报错日志,同时也有程序开发者的报错提示,日志内容和日志级别是开发人员明确指定的,对于其他的字段信息,只需要考虑是否显示在日志中就可以了。无论你怎么提示,最重要的是必须能够让看的人直到问题是什么,在哪出现的,以及发生的时间。没有这些信息,就不算一个日志该有的内容格式
实现模块
Python 自身提供的一个模块:logging
logging 模块
该模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统
它是Python的标准库模块,由标准库提供日志记录API的好处是,所有的Python模块都可使用这个日志记录功能
logging的日志级别
它有自己的默认定义的日志等级,也允许开发人员自定义其他日志等级,但一般不推荐。因为可能会导致日志级别混乱
DEBUG:最详细的日志信息。适用场景是 问题诊断
INFO:详细程度仅此于DEBUG,通常只记录关键节点信息,用于确认运行流程顺序是否按预期进行
WARNING:当某些不希望的事情发生时的记录,此时程序还能运行,比如:磁盘空间不足,或者连接访问资源失败
ERROR:由于严重问题导致功能不能正常运行时的记录
FATAL/CRITICAL:系统即将完全崩溃
一般开发时使用DEBUG或INFO,上线或部署生产时使用WARNING或ERROR或CRITICAL级别,减轻I/O压力和提高错误日志的抓取效率,一般级别在配置文件中指定
logging的使用方式
loggers:提供应用程序代码直接使用的接口
handlers:用于将日志记录发送到指定的目的位置
filters:提供更加细致的日志过滤功能,用于决定哪些日志记录被输出
formatters:控制日志信息的最终输出格式
# 设置日志的记录等级
logging.basicConfig(level=logging.DEBUG)
# 调试debug级
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024*1024*100, backupCount=10)
# 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flask app使用的)添加日志记录器
logging.getLogger().addHandler(file_log_handler)
使用logging的模块级别的函数记录日志
importlogging
logging.debug("This is a debug log.")logging.info("This is a info log.")
logging.warning("This is a warning log.")logging.error("This is a error log.")
logging.critical("This is a critical log.")
# 或者是这样写
logging.log(logging.DEBUG,"This is a debug log.")
logging.log(logging.INFO,"This is a info log.")
logging.log(logging.WARNING,"This is a warning log.")
logging.log(logging.ERROR,"This is a error log.")
logging.log(logging.CRITICAL,"This is a critical log.")
其实说到底,日志就像是一个人的身体检查报告,能够帮助一个从来都不认识的你的医生,在最简短的时间内知道你的问题在哪,然后他能够根据你的情况去提供最有效的解决办法。当前运维的小哥哥们都是这样做的,至于医生是不是。。。你猜吧
好了,本次的logging介绍完,其实它的作用不是想的那么大,但就是不可缺失。所以请每个开发的工作者们,写好自己的日志记录吧,方便别人的同时,也是在提高自己。当然如果对于本人文章哪里有错误或者不足,请留言,我会及时更改的。