Python 日志模块 logging 的最佳实践,内容干练简洁

发布时间:2024年01月09日


1. 引言

每次写 python 代码,想找一个日志模块 logging 的最佳实践,都要找一大圈,确不一定可以找到合适的最佳实践。

痛定思痛,我决定下笔记录目前觉得合适的 python 日志的用法,内容干练简洁!

2. 定义日志类

强烈建议定义一个日志类,不太建议用一个函数或者随意的几行代码去初始化,时间长了你就会发现有很多重复且零散的代码。

把日志模块单独放入到一个包中,例子如下:

import logging
import pathlib

# 定义一个通用的日志类,封装 logging 包的用法
class Log:
    def __init__(self, file_name, logger_name=None, level=logging.INFO):
        self.file_name = file_name
        self.level = level
        self.logger = logging.getLogger(logger_name)
        self.logger.setLevel(self.level)
        self.init_log()

    def init_log(self):
        # FileHandler: 将格式化的日志记录写入磁盘文件的处理程序类
        handler = logging.FileHandler(self.file_name)
        handler.setLevel(self.level)
        formatter = logging.Formatter(
            "[%(asctime)s - %(filename)s - %(name)s - %(levelname)s]: %(message)s"
        )
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

        # StreamHandler: 将格式化的日志打印到前台
        stream_handler = logging.StreamHandler()
        stream_handler.setLevel(self.level)
        stream_handler.setFormatter(formatter)
        # 添加处理器
        self.logger.addHandler(stream_handler)

    def info(self, msg):
        self.logger.info(msg)

    def debug(self, msg):
        self.logger.debug(msg)

    def warning(self, msg):
        self.logger.warning(msg)

    def error(self, msg):
        self.logger.error(msg)

    def critical(self, msg):
        self.logger.critical(msg)


# 以下根据情况去定义,可以初始化定义在这里,也可以根据自身情况定义在其他地方
log_path = pathlib.Path(__file__).parent.joinpath("biz.log")
log = Log(log_path)


if __name__ == "__main__":
    log.info("test log")

注意,日志类最好是单例模式,即仅仅初始化一次,不要重复去初始化类!

3. 引用日志

例如,我的日志类定义在 pkg/log/log.py
在这里插入图片描述
引用使用日志的时候:

from pkg.log.log import log
...
if __name__ == '__main__':
    log.info("start to do")
    ...
    log.info("finished")

这样运行的时候,就在文件 biz.log 以及控制台前台都输出了!

整体内容简洁易懂,没有其他多余的介绍,网上其他地方介绍了很多 python 日志的基础用法,我这里不介绍了,直接 copy 使用即可!

4. 参考

https://blog.51cto.com/u_16175525/6850774

文章来源:https://blog.csdn.net/qq_36803941/article/details/135483949
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。