系列文章目录
Tools\vlog.py
日志工具
该功能主要是针对本地运行过程中需要使用的文件
Python 版本:3.10.5
代码检查工具、风格:PEP 8、pylint
编辑器:Vscode
注释文案:这里特别提示一下,我偏向于无注释代码,所以,很多时候,变量名、方法名、文件名、类名都是注释,当然由于英文水平不怎么好,什么动词、名词、形容词啥的容易混淆,能理解就好了。
使用方式
日志功能的使用方式还是比较简单的
Vlog = Vlog().vlog.info("需要输出的内容")
日志的好处
其实对于日志这个工具来说,很多人觉得比较麻烦,有些时候更觉得可能 print 更方便一些,其实在我眼里不然
我认为日志工具,他的作用不仅限于日志的输出和保存,以下简单列一些:
- 可以做为注释进行代码行为的描述
- 因为是代码的一部分,不会像注释一样,代码改了,注释没改,导致注释和代码逻辑有所差距
- 可以在过程中查看到从代码执行到最后结束所消耗的时间,换个角度来说,代码的性能可以得到记录
- 保存内容,历史原因是最难追溯的,所以可记录下来的内容就可以协助你进行考古
- 等等...
当然,最后还是要看大家是否需要日志,至少我认为日志是一个base工具,还是非常实在的
下面就直接上代码了,不去多说了
"""日志工具:
本工具主要是针对本地文件运行的过程中,进行日志输出
根据自己的需要,可以进行日志等级的调整
"""
import os
import time
import logging
from logging import handlers
class Vlog():
"""_summary_ 日志功能, 实例化后, 调用 "vlog" 即可选择不同的打印类型
当前输出格式为: 时间(精确到毫秒) - 文件名 <行数> - 模块名称 -> 日志详情
使用格式举个栗子: Vlog = Vlog().vlog.info("需要输出的内容")
"""
DIR_LOGS = "_logs"
LOG_FOLDERS_NAME = "%Y_%m_%d"
LOG_FILES_NAME = "%Y_%m_%d-%H_%M_%S"
THIS_FILE_PATH = os.path.dirname(__file__)
PROJECT_FOLDER_PATH = os.path.dirname(THIS_FILE_PATH)
LOGS_FOLDER_PATH = os.sep.join([PROJECT_FOLDER_PATH, DIR_LOGS])
LEVEL_RELAIONS = {'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL}
def __init__(self, level: str = 'info') -> None:
name_for_per_min_log_files = time.strftime(self.LOG_FILES_NAME, time.localtime())
name_for_per_day_log_folders = name_for_per_min_log_files.split("-")[0]
per_day_log_folders_path = os.sep.join([self.LOGS_FOLDER_PATH,
name_for_per_day_log_folders])
if not os.path.exists(per_day_log_folders_path):
os.makedirs(per_day_log_folders_path)
else:
pass
per_min_logs_save_name = os.sep.join([per_day_log_folders_path,
f"{ name_for_per_min_log_files }.log"])
self.vlog = logging.getLogger(per_min_logs_save_name)
formatter = "[%(levelname)s] - [%(asctime)s] - [%(filename)s <%(lineno)d>] -> %(message)s"
set_formatter_to_logging = logging.Formatter(formatter)
self.vlog.setLevel(self.LEVEL_RELAIONS.get(level))
terminal_visitor = logging.StreamHandler()
terminal_visitor.setFormatter(set_formatter_to_logging)
self.vlog.addHandler(terminal_visitor)
log_saver = handlers.RotatingFileHandler(filename=per_min_logs_save_name,
mode="a", maxBytes=1024*1000,
backupCount=5, encoding='utf-8')
log_saver.setFormatter(set_formatter_to_logging)
self.vlog.addHandler(log_saver)
if __name__ == '__main__':
vlog = Vlog().vlog
vlog.debug("这是 vlog 模块测试内容1")
vlog.info("这是 vlog 模块测试内容2")
vlog.warning("这是 vlog 模块测试内容3")
vlog.error("这是 vlog 模块测试内容4")
vlog.critical("这是 vlog 模块测试内容5")