当前位置: 首页 > news >正文

开发组日志记录SPEC_v0.1.0

文章目录

  • 开发组日志记录SPEC_v0.1.0
    • 目的
    • 设计逻辑
    • 1. User日志记录器
      • 1.1 记录器标签内容介绍
      • 1.2 程序打印User日志规则
    • 2. Dev日志记录器
      • 2.1 记录器标签内容介绍
      • 2.2 程序打印Dev日志规则
    • 3.代码说明
      • 3.1 代码详情
      • 3.2 使用说明

更新记录

时间版本内容修订者备注
2024/08/150.1.0创建henry.xu

开发组日志记录SPEC_v0.1.0

目的

    1. 区分用户日志和开发人员日志
    1. 帮助开发人员快速定位

设计逻辑

  • 重新封装logging模块,在基本不改变代码的情况下替换掉之前使用的log日志系统;
  • 定义两个日志记录器分别对应User 和 Dev;
  • 提供参数dev区分两个日志记录器;dev=True代表Dev日志记录器;dev=False代表User日志记录器
  • 为了方便开发人员开发调试,提供参数dev_log_enabled,为True的时候,控制台会打印属于 Dev 记录器的日志信息,反之则不打印;

1. User日志记录器

  • 高于或等于设置的日志事件等级的日志,控制台和log文件都会记录;

1.1 记录器标签内容介绍

  • User 代表给用户看的日志内容;
  • D 代表该日志等级为debug;
  • 2024-08-12 18:57:44 代表打印日志的时间;
  • auto_logger 代表当前模块名称;
  • 121代表代码在当前模块所在行数;
  • This is a debug message 代表用户要看到的信息;
[User D 2024-08-12 18:57:44 auto_logger:121] This is a debug message

1.2 程序打印User日志规则

  • 按照需求分析表步骤编号打印

  • 日志内容格式规则:

    • Step:按照项目需求分析表中的步骤编号填写;
    • 步骤内容:按照项目需求分析表中的需求描述或功能介绍填写;
    • 信息反馈:按照项目需求分析表中的预期效果填写;
    • 测试结果:执行成功为PASS, 反之则为FAIL;
#例子:#代码
logger.info("""Step: 1-1-1步骤内容: 设置UAC:搜索UAC->选择Change User Account Control settings打开UAC设置界面->设置UAC为Never notify->点击ok完成信息反馈: 成功设置UAC为Never notify测试结果: PASS""")# 实际效果:
[User I 2024-08-15 10:54:59 auto_logger:130] Step: 1-1-1步骤内容: 设置UAC:搜索UAC->选择Change User Account Control settings打开UAC设置界面->设置UAC为Never notify->点击ok完成信息反馈: 成功设置UAC为Never notify测试结果: PASS

2. Dev日志记录器

2.1 记录器标签内容介绍

  • Dev代表这是给开发/测试/需求人员的,可以设置是否需要在控制台上打印
  • 其他内容同User日志记录器;
[Dev  I 2024-08-12 19:00:26 auto_logger:122] This is an info message

2.2 程序打印Dev日志规则

  • 要求程序执行每个方法前需要打印"STA: 方法名",执行完方法以后,打印"END:方法名";
# 例子
# 利用装饰器实现import timedef log_execution(func):def wrapper(*args, **kwargs):logger.info(f"STA: {func.__qualname__}", dev=True)result = func(*args, **kwargs)logger.info(f"END: {func.__qualname__}", dev=True)return resultreturn wrapperclass MyClass:@log_executiondef my_method_1(self):time.sleep(1)logger.info("正在执行 my_method_1")@log_executiondef my_method_2(self, x):time.sleep(2)logger.info(f"正在执行 my_method_2,参数: {x}")# 示例用法
obj = MyClass()
obj.my_method_1()
obj.my_method_2(5)# log展示:
"""
[Dev  I 2024-08-15 14:07:41 auto_logger:142] STA: MyClass.my_method_1
[User I 2024-08-15 14:07:42 auto_logger:154] 正在执行 my_method_1
[Dev  I 2024-08-15 14:07:42 auto_logger:144] END: MyClass.my_method_1
[Dev  I 2024-08-15 14:07:42 auto_logger:142] STA: MyClass.my_method_2
[User I 2024-08-15 14:07:44 auto_logger:159] 正在执行 my_method_2,参数: 5
[Dev  I 2024-08-15 14:07:44 auto_logger:144] END: MyClass.my_method_2
"""

3.代码说明

3.1 代码详情

import logging
import osimport colorlogCRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0class LoggerManager:def __init__(self, log_file='log.txt'):self.file_handler_formatter = '[%(name)s %(levelname)1.1s %(asctime)s %(module)s:%(lineno)d] %(message)s'self.console_handler_formatter = '%(log_color)s[%(name)s %(levelname)1.1s %(asctime)s %(module)s:%(lineno)d] %(log_color)s%(message)s'self.color_formatter = colorlog.ColoredFormatter(self.console_handler_formatter,datefmt='%Y-%m-%d %H:%M:%S',log_colors={'DEBUG': 'cyan','INFO': 'green','WARNING': 'yellow','ERROR': 'red','CRITICAL': 'bold_red'})# 设置日志文件路径self.log_file = os.path.join(os.getcwd(), log_file)# 控制台处理器(可选)self._dev_log_enabled = Falseself.console_handler = Noneself.user_logger = self._create_user_logger()self.dev_logger = self._create_dev_logger()def logfile(self, filename, mode='a', encoding=None, delay=False, errors=None):# 添加文件处理器file_handler = logging.FileHandler(filename, mode=mode, encoding=encoding, delay=delay, errors=errors)file_handler.setLevel(logging.DEBUG)formatter = logging.Formatter(self.file_handler_formatter, datefmt="%Y-%m-%d %H:%M:%S")file_handler.setFormatter(formatter)# 添加文件处理器self.user_logger.addHandler(file_handler)self.dev_logger.addHandler(file_handler)def _create_user_logger(self):logger_ = logging.getLogger('User')logger_.setLevel(logging.DEBUG)# 控制台处理器console_handler = colorlog.StreamHandler()console_handler.setLevel(logging.DEBUG)console_handler.setFormatter(self.color_formatter)logger_.addHandler(console_handler)return logger_@staticmethoddef _create_dev_logger():logger_ = logging.getLogger('Dev ')logger_.setLevel(logging.DEBUG)return logger_@propertydef dev_log_enabled(self):"""控制Dev记录器的控制台处理器的启用和禁用"""return self._dev_log_enabled@dev_log_enabled.setterdef dev_log_enabled(self, value):"""启用或禁用控制台处理器"""if value and not self._dev_log_enabled:# 如果请求启用并且当前未启用,则添加控制台处理器if self.console_handler is None:self.console_handler = colorlog.StreamHandler()self.console_handler.setLevel(logging.DEBUG)self.console_handler.setFormatter(self.color_formatter)self.dev_logger.addHandler(self.console_handler)elif not value and self._dev_log_enabled:# 如果请求禁用并且当前已启用,则移除控制台处理器self.dev_logger.removeHandler(self.console_handler)self._dev_log_enabled = valuedef set_log_level(self, level):"""设置 User 和 Dev 记录器的日志级别"""self.user_logger.setLevel(level)self.dev_logger.setLevel(level)for handler in self.user_logger.handlers:handler.setLevel(level)for handler in self.dev_logger.handlers:handler.setLevel(level)def debug(self, message, dev=False):logger_ = self.dev_logger if dev else self.user_loggerlogger_.debug(message, stacklevel=2)def info(self, message, dev=False):logger_ = self.dev_logger if dev else self.user_loggerlogger_.info(message, stacklevel=2)def warning(self, message, dev=False):logger_ = self.dev_logger if dev else self.user_loggerlogger_.warning(message, stacklevel=2)def error(self, message, dev=False):logger_ = self.dev_logger if dev else self.user_loggerlogger_.error(message, stacklevel=2)def critical(self, message, dev=False):logger_ = self.dev_logger if dev else self.user_loggerlogger_.critical(message, stacklevel=2)logger = LoggerManager()

3.2 使用说明

以下是 logging 模块中记录器、格式器、处理器、筛选器作用介绍:

组件主要作用
Logger- 日志记录器提供记录日志的接口,并将日志消息传递给 Handler
Handler-处理器将日志消息传递到指定的目标位置,如文件、控制台、网络等
Formatter-格式器定义日志消息的输出格式,包括时间戳、日志级别、消息内容等
Filter-筛选器控制哪些日志消息应该被记录或忽略,提供细粒度的日志控制
# 日志模块# 实例化;
logger = LoggerManager() # 为记录器添加文件处理器;不添加则不生成日志文件;
logger.logfile(filename="1.txt") # 设置log_level
logger.set_log_level(level=INFO)# 启用 Dev 记录器的控制台处理器;
# 为True的时候,控制台会打印属于 Dev 记录器的日志信息,反之则不打印;
logger.dev_log_enabled = True# dev参数默认为False;
# True表示该日志属于 Dev 日志记录器,反之表示该日志属于 User 记录器;
# 表示这条消息在logger.dev_log_enabled设置为False的时候,不会打印在系统终端;
logger.info('This is an info message', dev=True)logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
http://www.lryc.cn/news/424628.html

相关文章:

  • MySQL8 innoDB引擎的精髓
  • 【C语言实现花屏效果并打包程序为exe可执行文件】
  • 数据结构——排序(2):选择排序+交换排序
  • jenkins升级踩坑记录
  • mysql笔记第二篇
  • Facebook的区块链技术:提升数据安全与隐私保护
  • ⌈ 传知代码 ⌋ Visual SLAM函数
  • Vue组件之间的通信
  • 【AI 绘画】模型转换与快速生图(基于diffusers)
  • 甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文
  • leetcode线段树(2940. 找到 Alice 和 Bob 可以相遇的建筑)
  • 用于不平衡医疗数据分类的主动SMOTE
  • linux文件更新日期与系统日期比较
  • leetCode - - - 哈希表
  • NGINX自动清理180天之前的日志
  • jackson 轻松搞定接口数据脱敏
  • Nginx 正则表达式与rewrite
  • tekton什么情况下在Dockerfile中需要用copy
  • 第九届世界渲染大赛在哪里提交作品呢?
  • fastjson(autoType)反序列化漏洞
  • Java入门基础16:集合框架1(Collection集合体系、List、Set)
  • Qt如何调用接口
  • Android14之解决编译libaaudio.so报错问题(二百二十七)
  • 【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)
  • 干货分享|如何使用Stable Diffusion打造会说话的数字人?
  • OrangePi AIpro学习4 —— 昇腾AI模型推理 C++版
  • vue js 多组件异步请求解决方案
  • 【Android】不同系统版本获取设备MAC地址
  • 残差网络--NLP上的应用
  • 1章4节:数据可视化, R 语言的静态绘图和 Shiny 的交互可视化演示(更新2024/08/14)