log-redfish-lts

Redfish / BMC 传感器数据采集工具 — 纯 Python 标准库实现,零依赖,指纹驱动

Python 3.6+ 零第三方依赖 Linux 服务器 CSV 输出

一、这个软件是干什么的

log-redfish-lts 是一个运行在 Linux 服务器上的命令行工具,用于持续采集服务器 BMC(基板管理控制器)暴露的传感器数据,并以 CSV 格式输出到终端。

典型使用场景:散热分析、服务器健康基线建立。把输出接到 Grafana / Excel / 时序数据库均可。

二、为什么用它

特点说明
零依赖只用 Python 标准库(http.client, ssl, json, csv),不需要 pip install 任何包,服务器上开箱即用
指纹驱动不同厂商 BMC 的接口路径和数据结构不同,全部通过 JSON 指纹文件配置,换机器不改代码
自动探测程序启动时自动遍历指纹文件匹配当前 BMC,无需手动指定机器类型
断线重连会话过期自动重新登录,网络抖动自动跳过当次采集,不中断主循环
无效值过滤自动过滤 65535(传感器故障标记)、NA、空值,避免污染数据
诊断日志每个 URI 的采集结果都有日志记录,配不通时看日志即可定位

三、整体架构

数据流如下,从左到右:

📝 config.ini BMC 地址、账号、采集间隔
🔗 指纹文件 JSON URI 路径 + 字段映射
采集引擎 登录 → 探测 → 提取 → 过滤
📄 CSV 输出 stdout / tee 写文件

模块职责

模块文件职责
log_redfish.py命令行入口:解析参数 → 加载配置 → 连接 BMC → 匹配指纹 → 循环采集 → CSV 输出
redfish_logger/client.pyHTTP 客户端:HTTPS 连接、会话登录/登出、GET 请求、SSL 处理
redfish_logger/fingerprinter.py指纹引擎:加载指纹文件 → 探测匹配 → 按字段映射提取数据 → 过滤无效值
redfish_logger/jsonpath.pyJSON 提取器:支持数组 [*]、字典 {*}、固定字段三种模式,支持嵌套路径
redfish_logger/config.py配置读取:解析 config.ini,UTF-8 编码
redfish_logger/sorter.py列排序:温度优先 → 功耗 → 其他 → 转速 → 占空比,同类型按自然排序
redfish_logger/logger_setup.py日志配置:按日期轮转,DEBUG 级别写入 logs/ 目录

四、安装

方式一:安装脚本(推荐)

# 需要 root 权限
sudo ./install.sh

安装脚本会:

  1. 将程序文件复制到 /opt/log_redfish/
  2. 创建日志目录 /opt/log_redfish/logs/
  3. config.ini 生成 config.ini.example 模板
  4. 如果不存在则从模板创建 config.ini
  5. 创建软链接 /usr/local/bin/log-redfish → 主程序

方式二:Makefile

sudo make install

方式三:开发模式(不安装,直接运行)

如果脚本所在目录下存在 config.ini,程序自动识别为开发模式,直接使用当前目录的文件,无需安装:

python3 log_redfish.py

安装后目录结构

/opt/log_redfish/ ├── log_redfish.py # 主程序入口 ├── redfish_logger/ # 核心模块包 │ ├── __init__.py │ ├── client.py # HTTP 客户端 │ ├── config.py # 配置读取 │ ├── fingerprinter.py # 指纹采集引擎 │ ├── jsonpath.py # JSON 数据提取 │ ├── sorter.py # 传感器列排序 │ ├── logger_setup.py # 日志配置 │ └── exceptions.py # 异常定义 ├── uri_fingerprints.json # 指纹文件(核心配置) ├── config.ini # 运行配置(BMC 地址、账号等) ├── config.ini.example # 配置模板(不被修改) └── logs/ # 运行日志(按日期轮转)

五、快速上手(3 步开始采集)

第 1 步:编辑配置文件

vim /opt/log_redfish/config.ini

填入 BMC 的 IP 地址、用户名、密码:

[redfish]
host = 10.17.17.19
username = admin
password = admin123
interval = 5
verify_ssl = false

第 2 步:运行采集

# 输出到终端同时写入文件
log-redfish | tee -a data.csv

第 3 步:停止采集

Ctrl+C,程序会自动登出 BMC 会话并退出。

首次运行时,程序会自动探测指纹文件中哪条指纹匹配当前 BMC,然后输出 CSV 表头并开始循环采集。 如果匹配失败,请查看 logs/ 下的日志排查原因。

六、命令行参数

所有配置文件的参数都可以通过命令行覆盖,方便临时切换机器而不改配置文件:

log-redfish [-H 地址] [-U 用户名] [-P 密码] [-i 间隔] [-t 超时] [-f 指纹ID] [--verify-ssl] [--no-verify-ssl]
参数全称类型说明覆盖配置项
-H --host 字符串 BMC 的 IP 地址或域名 host
-U --username 字符串 登录用户名 username
-P --password 字符串 登录密码 password
-i --interval 浮点数 采集间隔(秒),如 0.5 表示 500ms interval
-t --timeout 浮点数 HTTP 请求超时时间(秒) timeout
-f --fingerprint-id 整数 强制使用指定 ID 的指纹(不自动探测) fingerprint_id
--verify-ssl 开关 验证 SSL 证书(默认不验证) verify_ssl = true
--no-verify-ssl 开关 不验证 SSL 证书(默认行为) verify_ssl = false

使用示例

# 示例 1:完全用配置文件
log-redfish | tee -a data.csv

# 示例 2:命令行指定 BMC 地址和账号
log-redfish -H 10.17.17.19 -U admin -P admin123 | tee -a data.csv

# 示例 3:快速采集(0.5 秒间隔)
log-redfish -i 0.5 | tee -a fast.csv

# 示例 4:指定指纹 ID(跳过自动探测)
log-redfish -f 2 | tee -a data.csv

# 示例 5:开发模式直接运行
python3 log_redfish.py -H 10.17.17.19 -U admin -P admin123
优先级:命令行参数 > 配置文件 > 默认值。如果某个参数在命令行提供了,就覆盖配置文件里的值。

七、配置文件 config.ini

配置文件为 INI 格式,位于 /opt/log_redfish/config.ini(开发模式下为脚本同目录)。所有参数集中在 [redfish] 节:

参数名类型默认值说明
host 字符串 无(必填) BMC 的 IP 地址或域名,不带 https:// 前缀
username 字符串 无(必填) BMC 登录用户名
password 字符串 无(必填) BMC 登录密码
interval 浮点数 5.0 采集间隔(秒),最小可设 0.1
verify_ssl 布尔值 false 是否验证 SSL 证书。BMC 通常用自签名证书,建议 false
timeout 浮点数 5.0 HTTP 请求超时(秒),超时后当次采集跳过
fingerprint_file 字符串 uri_fingerprints.json 指纹文件路径。相对路径相对于安装目录,也可写绝对路径
fingerprint_id 整数 无(注释掉) 指定指纹 ID 跳过自动探测。建议注释掉使用自动探测
建议:将 fingerprint_id 注释掉(前面加 #),让程序自动遍历指纹文件匹配。 这样换机器时只需改 host/账号,不用管指纹 ID。

完整配置示例

[redfish]
host = 10.17.17.19
username = admin
password = admin123
interval = 5
verify_ssl = false
fingerprint_file = uri_fingerprints.json
timeout = 5
# fingerprint_id = 3   # 注释掉以启用自动探测

八、关键文件说明

文件用途需要改吗
config.ini 运行配置:BMC 地址、账号、间隔 需要,每次换机器都要改
uri_fingerprints.json 指纹文件:URI 路径 + 字段映射 换新型号时追加一条指纹(详见指纹编写指南)
log_redfish.py 主程序入口 不需要
redfish_logger/ 核心模块包(客户端、指纹引擎、提取器等) 不需要
logs/ 运行日志,按日期命名(如 redfish_20260717.log) 不需要,可定期清理
关于指纹文件:这是实现"任意路径都能采集"的核心配置。怎么写指纹详见 ReadMe.html(指纹文件编写指南)。遇到新机器只需在 JSON 里加一条,不用改任何代码。

九、输出格式

程序输出 CSV 到 stdout,第一行是表头,后续每行是一次采集:

采集时间,CPU0_Temp,CPU1_Temp,Inlet_Temp,System_Power,Fan0_rpm,Fan0_duty,Fan1_rpm,Fan1_duty
2026-07-17 10:30:00,45,47,32,120,3000,35,3200,38
2026-07-17 10:30:05,45,48,32,118,3000,35,3200,38
2026-07-17 10:30:10,46,48,,119,3050,36,3200,38
表头在初次采集时确定:程序第一次采集拿到的字段列表就是 CSV 列顺序,之后每次按此顺序输出。 列顺序由 sorter 模块排序:inlet_temp 最前 > 其他温度 > 功耗 > 其他 > 转速 > 占空比。
空值含义:如果某次某传感器值=65535/NA/空,该列在那一行为空(不是 0,不是 65535)。 这是设计意图:避免把传感器故障值当成真实读数画进图表。

十、错误处理与自动恢复

场景程序行为
网络连接失败 记录错误日志,程序退出(无法连上 BMC 无法工作)
认证失败(用户名/密码错) 记录错误日志,程序退出
会话过期(HTTP 401) 自动重新登录,重登成功后继续采集;重登失败则记录错误,当次数据为空跳过
单个 URI 请求失败 跳过该 URI,其他 URI 的数据正常输出;日志记录哪个 URI 失败
所有 URI 都采集失败 当次输出空行(日志标记"本次采集无数据"),不中断主循环
传感器值=65535/NA/空 该字段被过滤,不出现在 CSV 行中
Ctrl+C 中断 自动登出 BMC 会话,记录退出日志,程序正常结束

十一、注意事项

1. BMC 必须开启 Redfish 服务:大多数服务器 BMC 默认支持 Redfish(/redfish/v1/), 但有些需要在 BMC 管理界面手动启用。用 curl -k https://<ip>/redfish/v1/ 验证。
2. 防火墙放通 443 端口:程序通过 HTTPS(443)访问 BMC,确保采集服务器到 BMC 的 443 端口可达。
3. SSL 证书:BMC 通常用自签名证书,verify_ssl = false 是默认行为。 如果你的 BMC 用了正规 CA 签发的证书且想验证,设 verify_ssl = true 或命令行加 --verify-ssl
4. 采集间隔不宜过小:BMC 性能有限,过于频繁的请求可能导致响应变慢甚至拒绝连接。 建议最小 1 秒。0.5 秒仅用于短时间调试。
5. 会话数量限制:BMC 的并发会话数有限(通常 5~10 个),如果程序异常退出未登出, 可能需要到 BMC 管理界面手动清除残留会话。正常 Ctrl+C 退出会自动登出。
6. 日志查看:运行日志在 logs/ 目录下,文件名按日期(如 redfish_20260717.log)。 日志级别 DEBUG,记录了每次采集的详细信息:每个 URI 提取了几个字段、哪个失败了、为什么。 配置不通时先看日志。
7. 输出重定向:程序把 CSV 输出到 stdout、日志输出到文件。用 tee 可同时显示和保存: log-redfish | tee -a data.csv-a 是追加模式,多次运行不会覆盖之前的数据。
8. 换机器只需两步:① 改 config.ini 里的 host/username/password; ② 如果是新型号 BMC,在 uri_fingerprints.json 里加一条指纹(见指纹编写指南)。 不需要重新安装、不需要改代码。

十二、卸载

方式一:卸载脚本

/opt/log_redfish/uninstall.sh

方式二:Makefile

sudo make uninstall

卸载会删除 /opt/log_redfish/ 目录和 /usr/local/bin/log-redfish 软链接。

注意:卸载会删除 config.ini 和指纹文件。如果自定义过,建议先备份: cp /opt/log_redfish/config.ini ~/config.ini.bak