logging日志的使用
📅 2026-2-6刚开始写代码时只是为了完成一些简单的数学题目,如果要检查代码运行情况和变量的值是否正确就直接用print函数直接打印出来。
在做大创项目中,代码量开始增加,一个数据处理文件就需要几百行,如果使用print函数对每个处理步骤中的代码进行检查特别难格式化输出。开始尝试使用logging日志的形式对程序的运行进行及时的检查。
相比于print
1.统一配置,便于更改与维护
import logging
logging.basicConfig(
# 编写日志配置
)
logger = logging.getLogger(__name__)
2.统一控制日志等级
level=logging.XXX(DEBUG,INFO,WARNING,ERROR,CRITICAL)
- DEBUG(全部细节):在开发过程中可以看到程序运行的全部细节。
- INFO(程序信息):查看程序运行的时间日期。
- WARNING(警告日志), ERROR(报错日志):只显示程序发生错误或潜在危险。
3.在配置中统一格式化
format='%(asctime)s - %(levelname)s - %(message)s', # 设置日志前缀,时间 - 级别 - 内容
不需要在每个日志中都进行一次格式化。
4.自定义输出地址
handlers=[
logging.StreamHandler() # 输出到控制台,调试中检查运行情况
logging.FileHandler('app.log') # 输出到文件,运行后检查结果
]
实际运用
对于在数据处理中的一个步骤分别使用print和logging。
以下是使用print:
print("--- 开始数据预处理 (Print模式) ---")
X = np.expand_dims(X, axis=1)
print(f"添加通道维度:{X.shape}")
y_tensor = torch.tensor(y, dtype=torch.long)
y_onehot = F.one_hot(y_tensor, num_classes=4)
print(f"对标签进行独热编码:{y_onehot.shape}")
X_tensor = torch.tensor(X, dtype=torch.float32)
print(f"转化为张量完毕:{X_tensor.shape}")
以下使用logging:
logger.info("--- 开始数据预处理 (Logging模式) ---")
X = np.expand_dims(X, axis=1) # 在第1维添加通道维度
logger.info(f"添加通道维度:{X.shape}")
y_tensor = torch.tensor(y, dtype=torch.long)
y_onehot = F.one_hot(y_tensor, num_classes=4)
logger.info(f"对标签进行独热编码:{y_onehot.shape}")
X_tensor = torch.tensor(X, dtype=torch.float32)
logger.info(f"转化为张量完毕:{X_tensor.shape}")
可以看到两种方法的代码相差不大,然而在输出结果上:
--- 开始数据预处理 (Print模式) ---
添加通道维度:(32, 1, 28, 28)
对标签进行独热编码:torch.Size([32, 4])
转化为张量完毕:torch.Size([32, 1, 28, 28])
11:30:05 - INFO - --- 开始数据预处理 (Logging模式) ---
11:30:05 - INFO - 添加通道维度:(32, 1, 28, 28)
11:30:05 - INFO - 对标签进行独热编码:torch.Size([32, 4])
11:30:06 - INFO - 转化为张量完毕:torch.Size([32, 1, 28, 28])
print模式的输出结果相较于日志缺少很多关键信息,例如时间节点,日志级别,日志信息的来源,以及日志信息的内容。
这使得调试和排查漏洞时更难精确定位程序问题。