文章目录
- 1. 引言
- 2. 定义日志类
- 3. 引用日志
- 4. 参考
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_nameself.level = levelself.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