当前位置: 首页 > 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')

相关文章:

开发组日志记录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创…...

MySQL8 innoDB引擎的精髓

[client] port 3306 socket /var/lib/mysql/mysql.sock [mysql] #prompt"\umysqldb \R:\m:\s [\d]> " #关闭自动补全sql命令功能 no-auto-rehash ########################################################################### ##服务端参数配置 ######…...

【C语言实现花屏效果并打包程序为exe可执行文件】

说明&#xff1a;该程序为临摹改良(&#x1f600;)作品&#xff0c;源地址C/C屏幕恶搞程序 效果展示 上代码 #include <windows.h>#define NUM 11451LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int main() // Renamed WinMain to main {static int iKeep[NU…...

数据结构——排序(2):选择排序+交换排序

目录 一、选择排序 &#xff08;1&#xff09;直接选择排序 ①思路 ②过程图示 ③代码实现 ④代码解释 ⑤优化 1.代码实现 2.过程图示 3.代码解释 4.注意 ⑥直接选择排序的复杂度 &#xff08;2&#xff09;堆排序 ①注意 ②代码实现 二、交换排序 &#xff08…...

jenkins升级踩坑记录

1. 直接用java 1.8版本启动最新版jenkins.war&#xff0c;直接失败 2. 下载java 11启动&#xff0c;依然失败&#xff0c;换成java17版本可以启动&#xff0c;但会报错 解决报错1&#xff1a; java.io.IOException: Failed to load: Parameterized Remote Trigger Plugin (Pa…...

mysql笔记第二篇

平时业务开发&#xff0c;大部分业务逻辑是使用sql还是代码编写呢&#xff1f; 这个每个公司可能要求不同&#xff0c;其实是每个公司负责人根据公司业务制定的规定。或者根本没有规定&#xff0c;每个负责单个项目的人领到需求直接开整&#xff0c;sql一把梭导致后面其他人维护…...

Facebook的区块链技术:提升数据安全与隐私保护

去中心化的优势 随着数字化时代的快速发展&#xff0c;数据安全和隐私保护已成为全球范围内备受关注的话题。Facebook作为全球最大的社交平台之一&#xff0c;正在积极探索如何通过区块链技术来提升数据的安全性和用户的隐私保护。区块链技术以其去中心化、不可篡改和透明的特…...

⌈ 传知代码 ⌋ Visual SLAM函数

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

Vue组件之间的通信

一、通信方式 Props 和 Events&#xff1a;通过父组件传递 props 给子组件&#xff0c;子组件使用 $emit 发送事件到父组件。Event Bus&#xff1a;使用一个中央事件总线来跨组件通信。Vuex&#xff1a;使用 Vuex 进行全局状态管理&#xff0c;以便在任何组件间共享状态。Prov…...

【AI 绘画】模型转换与快速生图(基于diffusers)

AI 绘画- 模型转换与快速生图&#xff08;基于diffusers&#xff09; 1. 本章介绍 本次主要展示一下不同框架内文生图模型转换&#xff0c;以及快速生成图片的方法。 SDXL文生图 2. sdxl_lightning基本原理 模型基本原理介绍如下 利用蒸馏方法获取小参数模型。首先&#x…...

甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文

论文真题 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…...

leetcode线段树(2940. 找到 Alice 和 Bob 可以相遇的建筑)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑…...

用于不平衡医疗数据分类的主动SMOTE

一、主动学习如何应用于不平衡数据的处理 首先&#xff0c;主动SMOTE不是像经典的SMOTE那样从训练集中随机选择一个样本作为生成合成样本的轴心点&#xff0c;而是通过不确定性和多样性采样来智能地进行样本选择&#xff0c;这是主动学习的两种技术。 在数据不平衡的情况下&…...

linux文件更新日期与系统日期比较

项目说明&#xff1a; 要获取linux系统中某目录下最新文件的修改时间并与当前系统时间进行比较&#xff0c;可以使用以下步骤&#xff1a; 使用 ls 命令获取最新文件的修改时间。 使用 date 命令获取当前时间。 计算时间差并打印结果。 实例脚本如下&#xff1a; #!/bin/…...

leetCode - - - 哈希表

目录 1.模拟行走机器人&#xff08;LeetCode 874&#xff09; 2.数组的度&#xff08;LeetCode 697&#xff09; 3.子域名访问次数&#xff08;LeetCode 811&#xff09; 4.字母异位词分组&#xff08;LeetCode 49&#xff09; 5.小结 1.常见的哈希表实现 2.遍历Map 1.模…...

NGINX自动清理180天之前的日志

需求描述 日志每天会以天为单位产生一个日志&#xff0c;不清理的话会越来越多。这里写一个Lua自定定时清理日志目录下的日志文件。 依赖安装 安装 lfs 模块 yum install luarocks yum install lua-develluarocks install luafilesystem 创建模拟旧文件 创建了一个1月的旧…...

jackson 轻松搞定接口数据脱敏

一、简介 实际的业务开发过程中&#xff0c;我们经常需要对用户的隐私数据进行脱敏处理&#xff0c;所谓脱敏处理其实就是将数据进行混淆隐藏&#xff0c;例如下图&#xff0c;将用户的手机号、地址等数据信息&#xff0c;采用*进行隐藏&#xff0c;以免泄露个人隐私信息。 如…...

Nginx 正则表达式与rewrite

目录 一、正则表达式 二、rewrite 2.1 rewrite简述 2.2 rewrite 跳转 2.3 rewrite 执行顺序 2.4 rewrite 语法格式 三、location 3.1 location 类别 3.2 location常用匹配规则 3.3 location优先级 3.4 示例说明 3.5 匹配规则总结 3.6 三个匹配规则定义 四、实战…...

tekton什么情况下在Dockerfile中需要用copy

kaniko配置如下 如果docker中的workDir跟tekton中的workDir不一致需要copy。也可以通过mv&#xff0c;cp达到类似效果...

第九届世界渲染大赛在哪里提交作品呢?

自第九届世界渲染大赛开放投稿以来&#xff0c;已经过去了10天。在这段时间里&#xff0c;众多CG爱好者已经完成了他们的动画创作。然而&#xff0c;许多参赛者对于如何提交他们的作品仍然感到困惑。接下来&#xff0c;让我们一起了解具体的投稿流程和入口&#xff0c;确保每位…...

fastjson(autoType)反序列化漏洞

1. 温少和他的fastjson 阿里巴巴的 FastJSON&#xff0c;也被称为 Alibaba FastJSON 或阿里巴巴 JSON&#xff0c;是一个高性能的 Java JSON 处理库&#xff0c;用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名&#xff0c;并在…...

Java入门基础16:集合框架1(Collection集合体系、List、Set)

集合体系结构 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的。 collection集合体系 Collection的常用方法 package com.itchinajie.d1_collection;import java.util.ArrayList; import java.util.HashSet;/* * 目…...

Qt如何调用接口

在Qt中&#xff0c;你可以使用QNetworkAccessManager类来调用API。以下是一个简单的示例&#xff1a; cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> int main(int arg…...

Android14之解决编译libaaudio.so报错问题(二百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…...

【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37350 随着人工智能技术的飞速发展&#xff0c;AI已经成为当今时代的重要驱动力。本报告将聚焦于人工智能AI行业的最新动态&#xff0c;涵盖客户服务、体验营销、资产管理以及国产AI大模型应用等多个领域。通过深入研究和分析&#xff0c;我们…...

干货分享|如何使用Stable Diffusion打造会说话的数字人?

数字人已不是什么新鲜名词了。在许多领域&#xff0c;尤其是媒体和娱乐领域&#xff0c;经常可以看到卡通形象的人物或逼真的虚拟主持人。在Stable Diffusion中&#xff0c;我们可以上传一段录制好的音频文件&#xff0c;然后使用SadTalker插件&#xff0c;将音频和图片相结合&…...

OrangePi AIpro学习4 —— 昇腾AI模型推理 C++版

目录 一、ATC模型转换 1.1 模型 1.2 ATC工具 1.3 实操模型转换 1.4 使用ATC工具时的一些关键注意事项 1.5 ATC模型转换命令举例 二、运行昇腾AI模型应用样仓程序 2.1 程序目录 2.2 下载模型和模型转换 2.3 下载图片和编译程序 2.4 解决报错 2.5 运行程序 三、运行…...

vue js 多组件异步请求解决方案

接口之间异步问题可以采用Promiseasyncawait 链接&#xff1a; https://blog.csdn.net/qq_39816586/article/details/103517416 使用场景&#xff1a; 1.保障用户必须完成自动登录&#xff0c;才调用后续逻辑 2.保障必须完成初始启动&#xff0c;才调用后续逻辑 3.保障先执行on…...

【Android】不同系统版本获取设备MAC地址

【Android】不同系统版本获取设备MAC地址 尝试实现 尝试 在开发过程中&#xff0c;想要获取MAC地址&#xff0c;最开始想到的就是WifiManager&#xff0c;但结果始终返回02:00:00:00:00:00&#xff0c;由于用得是wifi &#xff0c;考虑是不是因为用得网线的原因&#xff0c;但…...

残差网络--NLP上的应用

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;残差网络&#xff08;ResNet&#xff09;同样有着广泛的应用。虽然最初的残差网络设计是为了处理图像任务&#xff0c;但其核心思想也被成功地迁移到了自然语言处理任务中&#xff0c;以解决深层神经网络中的退化问题…...

六安最新疫情名单/关键词优化公司费用多少

转载于:https://www.cnblogs.com/classmethond/p/10387954.html...

做网站需要提供什么/百度账户托管

使用maxwell实时采集mysql数据 1. 什么是maxwell maxwell 是由美国zendesk开源&#xff0c;用java编写的Mysql实时抓取软件。 其抓取的原理也是基于binlog。 2. Maxwell与canal的对比 Maxwell 没有 Canal那种serverclient模式&#xff0c;只有一个server把数据发送到消息队…...

海门市住房和城乡建设局网站/花西子网络营销策划方案

bug1:while循环中的*des *src; 不能这么写吧。。。 bug2&#xff1a;maxSize没有定义 暂时看到这么多转载于:https://www.cnblogs.com/yuanyue-nenu/p/7702004.html...

大连网站制作推广/常用的网络推广手段有哪些

启动和关闭服务指令 启动&#xff1a;redis-server.exe --service-start 关闭&#xff1a;redis-server.exe --service-stop 下面也可以 redis-server --service-start redis-server --service-stop 卸载服务 指令&#xff1a;redis-server --service-uninstall...

体育网站界面该怎样做/网站seo策划方案案例分析

原文链接&#xff1a;https://blog.csdn.net/know9163/article/details/80554769#commentBox Eclipse背景颜色设置&#xff08;设置成豆沙绿色保护眼睛&#xff0c;码农保护色&#xff09; 原文链接&#xff1a;https://blog.csdn.net/l0605020112/article/details/25829121转载…...

简述网络营销策略/南京seo网站管理

数学工具v7.2使用文档文章目录前言软件链接计算器功能具体支持的运算符具体支持的初等函数优先级和结合性求解线性规划问题格式说明问题升级到求解整数规划画函数基本语法同时画多个函数控制自变量范围宏替换插值法使用说明画方程前言 我发现现在市面上的很多移动端数学软件用起…...