江苏城乡建设教育网站,手机wap网站免费建站,wordpress横幅图像,网站服务器租用需要注意的点文章目录 开发组日志记录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创… 文章目录 开发组日志记录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
目的 区分用户日志和开发人员日志 帮助开发人员快速定位
设计逻辑
重新封装logging模块在基本不改变代码的情况下替换掉之前使用的log日志系统定义两个日志记录器分别对应User 和 Dev提供参数dev区分两个日志记录器devTrue代表Dev日志记录器devFalse代表User日志记录器为了方便开发人员开发调试提供参数dev_log_enabled为True的时候控制台会打印属于 Dev 记录器的日志信息反之则不打印
1. User日志记录器
高于或等于设置的日志事件等级的日志控制台和log文件都会记录
1.1 记录器标签内容介绍
User 代表给用户看的日志内容D 代表该日志等级为debug2024-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 message1.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测试结果: PASS2. Dev日志记录器
2.1 记录器标签内容介绍
Dev代表这是给开发/测试/需求人员的可以设置是否需要在控制台上打印其他内容同User日志记录器
[Dev I 2024-08-12 19:00:26 auto_logger:122] This is an info message2.2 程序打印Dev日志规则
要求程序执行每个方法前需要打印STA: 方法名执行完方法以后打印END:方法名
# 例子
# 利用装饰器实现import timedef log_execution(func):def wrapper(*args, **kwargs):logger.info(fSTA: {func.__qualname__}, devTrue)result func(*args, **kwargs)logger.info(fEND: {func.__qualname__}, devTrue)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_23.代码说明
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_filelog.txt):self.file_handler_formatter [%(name)s %(levelname)1.1s %(asctime)s %(module)s:%(lineno)d] %(message)sself.console_handler_formatter %(log_color)s[%(name)s %(levelname)1.1s %(asctime)s %(module)s:%(lineno)d] %(log_color)s%(message)sself.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, modea, encodingNone, delayFalse, errorsNone):# 添加文件处理器file_handler logging.FileHandler(filename, modemode, encodingencoding, delaydelay, errorserrors)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_enableddev_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, devFalse):logger_ self.dev_logger if dev else self.user_loggerlogger_.debug(message, stacklevel2)def info(self, message, devFalse):logger_ self.dev_logger if dev else self.user_loggerlogger_.info(message, stacklevel2)def warning(self, message, devFalse):logger_ self.dev_logger if dev else self.user_loggerlogger_.warning(message, stacklevel2)def error(self, message, devFalse):logger_ self.dev_logger if dev else self.user_loggerlogger_.error(message, stacklevel2)def critical(self, message, devFalse):logger_ self.dev_logger if dev else self.user_loggerlogger_.critical(message, stacklevel2)logger LoggerManager()3.2 使用说明
以下是 logging 模块中记录器、格式器、处理器、筛选器作用介绍
组件主要作用Logger- 日志记录器提供记录日志的接口并将日志消息传递给 HandlerHandler-处理器将日志消息传递到指定的目标位置如文件、控制台、网络等Formatter-格式器定义日志消息的输出格式包括时间戳、日志级别、消息内容等Filter-筛选器控制哪些日志消息应该被记录或忽略提供细粒度的日志控制
# 日志模块# 实例化
logger LoggerManager() # 为记录器添加文件处理器不添加则不生成日志文件
logger.logfile(filename1.txt) # 设置log_level
logger.set_log_level(levelINFO)# 启用 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, devTrue)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)