Python(黄金时代)—— 搞定python的日志


介绍

在软件开发过程中,日志记录是至关重要的一环。通过有效的日志系统,我们可以方便而准确地跟踪程序运行状态、排查问题,同时记录重要信息和操作日志。以下将介绍Python中日志的使用方法以及如何通过日志模块优化程序开发和维护过程。

为什么使用日志

  • **跟踪程序运行状态:**在开发和调试过程中,我们需要及时了解程序执行过程中的变量值、运行状态等信息,以便快速定位和解决问题。

  • **错误排查和定位:**当程序发生错误时,详细的错误信息能够大大缩短排查问题的时间,在生产环境下尤为重要。

  • **系统性能监控:**通过记录关键操作的性能指标和时间戳,我们可以深入了解程序性能瓶颈,从而优化。

  • **运行信息记录:**记录程序运行时的关键信息以及用户操作日志,便于问题溯源。


程序

Python自带的`logging`模块提供了日志记录功能。以下是Python日志的基本使用步骤

日志的基本使用代码

import logging``   ``# 配置日志记录器和处理器``logging.basicConfig(level=logging.DEBUG,`                    `filename='app.log',`                    `format='%(asctime)s - %(levelname)s - %(message)s')``   ``# 创建日志记录器``logger = logging.getLogger("mylog")``# 记录日志``logger.debug('这是debug级别日志')``logger.info('这是info级别日志e')``logger.warning('这是warning级别日志')``logger.error('这是error级别日志')

日志输出到文件中,同时出在控制台打印

import logging``   ``# 配置日志记录器和处理器``logging.basicConfig(level=logging.DEBUG,`                    `filename='app.log',`                    `format='%(asctime)s - %(levelname)s - %(message)s')``   ``# 创建控制台处理器``console_handler = logging.StreamHandler()``console_handler.setLevel(logging.DEBUG)``   ``# 设置日志格式``formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')``console_handler.setFormatter(formatter)``   ``# 将控制台处理器添加到根日志处理器``logging.getLogger("mylog").addHandler(console_handler)``   ``# 记录日志``logging.debug('这是debug级别日志')``logging.info('这是info级别日志e')``logging.warning('这是warning级别日志')``logging.error('这是error级别日志')

Formatter参数解释

  • `%(asctime)s`:日志记录的时间,以日期和时间的格式显示。

  • `%(levelname)s`:日志记录的级别,如DEBUG、INFO、WARNING、ERROR、CRITICAL。

  • `%(message)s`:日志记录的消息内容。

  • ‘%(name)s’: 记录器的名称。

  • ‘%(module)s’: 记录器所在的模块名称。

  • ‘%(lineno)d’: 记录器所在的模块的行号。

  • ‘%(pathname)s’: 记录器所在的模块的路径。

  • ‘%(funcName)s’: 记录器所在的函数名。

捕获和记录异常信息日志

try:`    `# 产生一个异常`    `result = 10 / 0``except Exception as e:`    `# 使用 logging.exception 记录并输出异常信息`    `logger.exception("此处发生了异常:")

注:此处打印的异常会自动带有堆栈信息

日志处理器

配置每天生成一个日志文件(TimedRotatingFileHandler)

import logging``from logging.handlers import TimedRotatingFileHandler``   ``# 创建日志记录器``logger = logging.getLogger("mylog")``logger.setLevel(logging.DEBUG)``   ``# 创建 TimedRotatingFileHandler 处理器``file_handler = TimedRotatingFileHandler(filename="logfile.log", when="midnight", backupCount=7)``file_handler.setLevel(logging.DEBUG)``   ``# 设置日志格式``formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')``file_handler.setFormatter(formatter)``   ``# 将处理器添加到日志记录器``logger.addHandler(file_handler)``   ``# 输出日志消息``logger.debug("debug 信息记录")

处理器参数解释

  • filename : 指定日志文件的文件名,可以包含路径(可选,默认为"logfile.log")。

  • when : 指定日志文件的轮换时间间隔。可选值包括以下几种:

  • “S”:每秒钟轮换一次文件;

  • “M”:每分钟轮换一次文件;

  • “H”:每小时轮换一次文件;

  • “D”:每天轮换一次文件;

  • “W0” - “W6”:每周轮换一次文件,其中"W0"代表周日,"W1"代表周一,以此类推;

  • “midnight”:每天零点就轮换一次文件(默认值)。

  • backupCount : 指定保留的旧日志文件的备份个数。当日志文件轮换时,超过指定备份数的旧日志文件将被自动删除(可选,默认为7个)。

根据文件大小生成新的日志文件**(RotatingFileHandler )**

import logging``from logging.handlers import RotatingFileHandler``   ``# 创建日志记录器``logger = logging.getLogger("mylog")``logger.setLevel(logging.DEBUG)``   ``# 创建 RotatingFileHandler 处理器``file_handler = RotatingFileHandler(filename="logfile.log", maxBytes=1024, backupCount=3)``file_handler.setLevel(logging.DEBUG)``   ``# 设置日志格式``formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')``file_handler.setFormatter(formatter)``   ``# 将处理器添加到日志记录器``logger.addHandler(file_handler)``   ``# 输出日志消息``logger.debug("debug 信息记录")

处理器参数解释

  • filename : 指定日志文件的文件名,可以包含路径(可选,默认为"logfile.log")。

  • maxBytes : 指定单个日志文件的最大字节数。当达到该字节数时,会自动创建一个新的日志文件(可选,默认为1024字节)。

  • backupCount : 指定保留的旧日志文件的备份个数。当日志文件轮换时,超过指定备份数的旧日志文件将被自动删除(可选,默认为3个)。

logging.basicConfig的使用场景

logging.basicConfig****是Python logging模块中用于简化日志配置的函数。它只能在程序开始时调用一次,用于配置默认的根日志记录器。

logging.basicConfig不适用场景:

  • **复杂的日志需求:**如果需要更多灵活的日志配置,如设置不同的日志级别、使用不同的日志处理器、添加过滤器等,logging.basicConfig就显得不够灵活。

  • **动态配置日志:**如果需要在程序运行过程中动态修改日志配置,logging.basicConfig就无法满足需求。

不适用场景的代码示例

import logging``   ``class MyLogger:`    `def __init__(self):`        `self.logger = logging.getLogger(__name__)`        `self.handler = logging.StreamHandler()`        `self.formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')``   `    `def configure_logger(self, level):`        `self.handler.setLevel(level)`        `self.handler.setFormatter(self.formatter)`        `self.logger.addHandler(self.handler)`        `self.logger.setLevel(level)``   `    `def log_message(self, message):`        `self.logger.debug(message)``   ``   ``my_logger = MyLogger()``my_logger.configure_logger(logging.DEBUG)``my_logger.log_message("自定义的日志处理器")

这个示例展示了一个需要动态配置日志记录器,并且拥有更多自定义需求的场景,使用`logging.basicConfig`就无法满足这种灵活性和个性化的需求。相反,我们可以通过自定义类和方法来灵活地配置日志记录器,并获得更多的控制选项。

总结

  • logging.basicConfig 适用于仅需进行简单的日志记录,对于日志级别、格式、输出目标等要求较为简单的场景。

  • 不要在子模块中使用 logging.basicConfig 设置日志模式

  • 建议在模块中通过 logger = logging.getLogger(__name__) 来创建日志对象 因为 __name__ 代表的是模板被加载的引用名称。

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

CSDN大礼包:全网最全《Python学习资料》免费赠送!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板

CSDN大礼包:全网最全《Python学习资料》免费赠送!(安全链接,放心点击)

若有侵权,请联系删除

你可能感兴趣的:(python,microsoft,windows)