每次写 python 代码,想找一个日志模块 logging 的最佳实践,都要找一大圈,确不一定可以找到合适的最佳实践。
痛定思痛,我决定下笔记录目前觉得合适的 python 日志的用法,内容干练简洁!
强烈建议定义一个日志类,不太建议用一个函数或者随意的几行代码去初始化,时间长了你就会发现有很多重复且零散的代码。
把日志模块单独放入到一个包中,例子如下:
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")
注意,日志类最好是单例模式,即仅仅初始化一次,不要重复去初始化类!
例如,我的日志类定义在 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 使用即可!
https://blog.51cto.com/u_16175525/6850774