Python机器学习模型中添加日志记录器
文章目录
- 1. 日志记录器的主要作用
- 2. 日志记录器的主要流程实现
- 2.0 日志记录器完整工作流程
- 2.1 创建日志记录器
- 2.2 创建控制台处理器
- 2.3 创建控制台处理器
- 2.4 总结
- 2.5 附加:日志级别体系
- 3. 案例应用
每天学点不会的东西!
今天看到别人代码里面有配置日志记录器的,感觉很厉害的样子,于是我也学一学。
1. 日志记录器的主要作用
日志记录器是Python logging 模块的核心组件,它是应用程序日志系统的入口点,负责捕获、处理和分发日志消息。日志记录器在软件开发中扮演着关键角色,特别是在需要追踪程序行为、调试问题和监控系统运行状态时。
1. 事件记录
捕获应用程序运行过程中的关键事件
记录用户操作、系统状态变化等
跟踪数据流和处理流程
2. 问题诊断
提供程序运行时的上下文信息
帮助重现和定位bug
记录异常堆栈跟踪
3. 性能监控
记录函数执行时间
追踪资源使用情况(内存、CPU等)
监控系统吞吐量和响应时间
4. 审计追踪
满足合规性要求
记录关键业务操作
提供操作历史追溯
5. 行为分析
收集用户行为数据
分析系统使用模式
支持业务决策
2. 日志记录器的主要流程实现
2.0 日志记录器完整工作流程
2.1 创建日志记录器
logger = logging.getLogger("LinearRegression")
logger.setLevel(log_level)
getLogger(“LinearRegression”):
- 创建一个名为"LinearRegression"的日志记录器实例
- 使用命名记录器可以区分不同模块的日志
- 相同名称的调用会返回同一个记录器实例(避免重复创建)
setLevel(log_level):
- 设置记录器处理的最低日志级别(如DEBUG/INFO/WARNING)
- 决定哪些级别的日志会被记录器接收和处理
- 示例:设为logging.INFO时,DEBUG级别的日志会被忽略
2.2 创建控制台处理器
file_handler = logging.FileHandler(log_file, encoding="utf-8")
file_handler.setLevel(log_level)
FileHandler(log_file):
- 创建文件输出处理器,将日志写入指定文件
- encoding="utf-8"确保中文等特殊字符正确保存
setLevel(log_level):
- 设置此处理器处理的最低日志级别
- 可以独立于记录器级别设置(实现不同输出目标的不同日志级别)
2.3 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(log_level)
StreamHandler():
- 创建控制台输出处理器,将日志打印到标准输出(通常是终端)
- 不需要指定文件路径
setLevel(log_level): - 设置控制台输出的日志级别
- 可单独设置为更高或更低级别(如开发时用DEBUG,生产用INFO)
2.4 总结
2.5 附加:日志级别体系
Python 的 logging 模块定义了 6 个标准级别(数值从小到大,级别从低到高):
logger.debug("详细调试信息") # 级别10
logger.info("常规操作信息") # 级别20
logger.warning("潜在问题警告") # 级别30
logger.error("严重错误") # 级别40
logger.critical("致命错误") # 级别50
3. 案例应用
通过对机器学习中一个简单模型线性回归的训练过程进行追踪,形成日志记录,下面是整个的代码帮助理解上述内容。
import logging
import numpy as np
import os
from datetime import datetime
import warnings
warnings.filterwarnings("ignore")class LinearRegression:def __init__(self, learning_rate=0.01, n_iter=1000, log_level=logging.INFO):self.learning_rate = learning_rateself.n_iter = n_iterself.logger = self.setup_logger(log_level)def setup_logger(self, log_level):"""配置并返回日志记录器"""# 创建日志目录log_dir = r"E:\stuay\日志"# os.mkdirs(log_dir) # 两种方式其实都可以os.makedirs(log_dir,exist_ok=True)# 生成带时间戳的日志文件名timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")print(timestamp)log_file = os.path.join(log_dir, f"linear_regression_{timestamp}.log")print(log_file)# 创建日志记录器logger = logging.getLogger("LinearRegression")logger.setLevel(log_level)# 创建文件处理器:用于将日志消息写入到指定的文件中file_handler = logging.FileHandler(log_file, encoding="utf-8")file_handler.setLevel(log_level)# 创建控制台处理器:用于将日志消息输出到控制台console_handler = logging.StreamHandler()console_handler.setLevel(log_level)# 设置日志格式fmt = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"formatter = logging.Formatter(fmt, datefmt="%Y-%m-%d %H:%M:%S")file_handler.setFormatter(formatter)console_handler.setFormatter(formatter)# 添加处理器:将处理器添加到记录器logger.addHandler(file_handler)# logger.addHandler(console_handler) # 注销掉,不会在控制台显示return loggerdef fit(self, X, y):"""训练线性回归模型"""# 添加偏置项X = np.c_[np.ones((X.shape[0], 1)), X]# 初始化参数self.theta = np.random.randn(X.shape[1], 1)# 记录训练开始信息self.logger.info("Starting linear regression training")self.logger.info(f"Training parameters: learning_rate={self.learning_rate}, iterations={self.n_iter}")self.logger.info(f"Dataset shape: {X.shape[0]} samples, {X.shape[1]-1} features")# 训练循环for iteration in range(self.n_iter):# 计算预测和误差predictions = X.dot(self.theta)errors = predictions - y.reshape(-1, 1)# 计算梯度并更新参数gradients = 2 / len(X) * X.T.dot(errors)self.theta -= self.learning_rate * gradients# 计算损失loss = np.mean(errors**2)# 定期记录进度if iteration % 100 == 0 or iteration == self.n_iter - 1:self.logger.debug(f"Iteration {iteration:4d}/{self.n_iter} - Loss: {loss:.6f}")# 训练完成记录self.logger.info("Training completed")self.logger.info(f"Final parameters: {self.theta.flatten()}")self.logger.info(f"Final loss: {loss:.6f}")return selfdef predict(self, X):"""使用训练好的模型进行预测"""X = np.c_[np.ones((X.shape[0], 1)), X]return X.dot(self.theta)# 示例使用
if __name__ == "__main__":# 生成样本数据np.random.seed(611)X = 2 * np.random.rand(1000, 1)y = 4 + 3 * X + np.random.randn(1000, 1)# 创建并训练模型model = LinearRegression(learning_rate=0.1, n_iter=500)model.fit(X, y)# 进行预测X_new = np.array([[0], [2]])predictions = model.predict(X_new)model.logger.info(f"Predictions for {X_new.flatten()}: {predictions.flatten()}")
生成了两个log_file,形如下图。
分别打开这两个,里面的内容可与代码中的去进行对应。
业精于勤荒于嬉,行成于思毁于随。哈哈哈