Welcome to Firefly
中文
Firefly文档中心
最近更新: 2026-09-28 15:36:44

日志收集

设备在运行过程中,会像写日记一样把发生的事情记录下来,这就是日志。排查问题时,只要抓对日志,往往能很快找到原因。

本文先按「出了什么问题」讲几个最常见的场景,告诉你每种情况该抓哪类日志、怎么抓、结果怎么看;最后再附上 fflog 的完整命令速查,供需要时查阅。跟随场景操作不需要懂编程,命令都可以直接复制,示例输出来自一台真实设备,实际内容以你的设备为准。

下图是在 BMC 上执行 fflog general --core sub05 --min-level warn 的真实效果:一条命令就能看到 sub05 这块子板上的错误日志。每条日志都包含时间、级别、出错模块(如 service-manager / network)、所属子板(sub05)、代码位置(如 transaction/job.go

)和具体原因,看一眼就能判断是哪块子板、哪个模块出了问题。

先登录 BMC

所有场景都从登录 BMC 命令行开始(日志保存在 BMC 里)。两种方式任选其一:

  • SSH:ssh bmc@<aBMC 管理 IP>,账号密码见访问 BMC;
  • BMC Shell:在 aBMC 网页里用 Remote console → BMC Shell 打开命令行。

登录后确认工具可用:

fflog --version
# fflog v1.0

忘了参数不要紧,直接运行 fflog 或 fflog <日志类型> --help 就能看到帮助。

场景一:某块子板异常或失联

现象:某块子板(例如 sub05)连不上、状态异常,或这块子板上的功能不可用。

这样做:只抓这块子板的日志,并优先看警告和错误。

fflog general --core sub05 --min-level warn

示例输出:

2026-09-22 15:00:15.204 warn node-service sub05 OS/node_deploy.go:306 nodeService recovery failed: failed to push nodeService: exit status 1
2026-09-22 15:00:48.220 error service-manager sub05 transaction/job.go:176 failed to start ssh-terminal: core sub05 is not a Linux device
2026-09-22 15:00:48.221 error service-manager sub05 transaction/job.go:176 failed to start file-sharing: sub05 is not a Linux device

不确定有哪些子板时,可以先列出来:

# 列出通用日志里出现过的所有子板名及条数
fflog general --all --fields core_name | sort | uniq -c
    535 -
    188 bmc
    135 machine
      9 sub01
      9 sub02
      9 sub03
      9 sub04
    646 sub05
      9 sub06
      9 sub07
     96 sub08
      9 sub09
      9 sub10

怎么看:

  • 有输出:按时间和内容定位模块。例如上面第一条是 node-service 报告 sub05 的 nodeService 恢复失败,后两条说明 ssh-terminal、file-sharing 在 sub05 上因「不是 Linux 设备」启动失败;
  • 没有输出:说明这块子板本身没记录到错误,问题可能在网络、供电等外部因素,可结合异常排查继续排查;
  • 列表中的 - 表示 BMC 侧未归属到具体子板的日志,bmc 是管理控制器本身,machine 是整机相关。

只有通用日志和系统日志能按子板抓(--core);管理日志没有子板维度,不能这样筛。

场景二:网页操作或接口调用失败

现象:在 aBMC 网页上做的操作没有生效,或某个 Redfish 接口返回了错误。

这样做:管理日志记录了「谁、什么时候、请求了什么、结果如何、耗时多少」,非常适合查这类问题。

# 最近的操作记录
fflog manager

# 只看没有成功(状态码不是 200)的请求
fflog manager --all --where "status_code != 200"

# 只看某个用户的请求
fflog manager --all --user admin

怎么看:一行管理日志依次是时间、级别、操作人、来源 IP、请求方式与地址、状态码、耗时、说明。例如:

2026-09-23 10:24:07.694 info RunLog admin 172.16.11.30 GET /redfish/v1/Systems/bmc/Oem/Firefly/DateTime 200 19 Successfully obtained date and time
2026-09-22 13:58:48.735 info RunLog admin 172.16.11.30 POST /redfish/v1/Systems/sub05/Actions/ComputerSystem.Reset 200 101 Successfully reset the server power supply

第一条是一次查询时间的成功请求(状态码 200,耗时 19 毫秒);第二条是对 sub05 的复位操作。状态码 2xx 表示成功,4xx/5xx 通常表示请求有问题或服务异常,结合 path 就能定位是哪个操作出了问题。

场景三:硬件报警(温度、电压、风扇)

现象:设备报警、风扇转速异常、面板指示灯异常,或收到温度、电压类告警。

这样做:系统日志记录硬件事件与传感器信息,先看它。

# 最近的系统日志
fflog system

# 今天的全部系统日志
fflog system --today --all

# 只看警告及以上
fflog system --all --min-level warn

怎么看:例如

2026-09-21 21:20:26.073 warn Log1 bmc SEL CPU State 33 "CPU temperature 70°C alarm":"bmc 节点cpu温度过 70 摄氏度"

这条说明 BMC 检测到 CPU State 传感器(编号 33)超过 70℃,并产生了一条 SEL 告警;可据此检查散热、风扇和环境温度。字段依次为:时间、级别、事件 ID、子板、事件类型、传感器类型、传感器编号、说明。

场景四:设备启动异常或某个服务起不来

现象:设备重启后某个功能不可用,或某个服务没有正常启动。

这样做:通用日志记录了各个模块的启动过程和报错。

# 最新的通用日志
fflog general

# 只看错误和警告
fflog general --level error,warn

# 只看某个模块
fflog general --logger service-manager

怎么看:例如

2026-09-23 09:11:44.674 error kea - dhcp4/core.go:81 /etc/kea/kea-dhcp4.conf is inexistence,program exit
2026-09-23 09:28:22.858 error network sub05 ffnetwork/lifecycle.go:58 unknown OS

第一条说明 DHCP 服务因为缺少配置文件而退出;第二条说明网络模块在 sub05 上无法识别系统。msg 是原因,前面的 logger(模块)和 caller(代码位置)能帮你快速定位。

场景五:问题正在复现,要抓现场

现象:问题时不时出现,或此刻正好在复现,想抓到出问题那一刻的日志。

这样做:用 --follow 持续跟踪新产生的日志(只显示命令启动后的新日志,不回放历史)。

# 持续输出新的错误日志
fflog general -f --level error

# 持续跟踪某块子板的新日志
fflog general --follow --core sub05

# 以 JSONL 格式持续输出,方便保存
fflog manager --follow --format jsonl

按 Ctrl+C 结束。

场景六:把日志提供给 Firefly 技术支持

现象:自己看不太明白,需要把日志发给 Firefly 技术支持分析。

这样做:先导出成文件再发送。建议用 --format jsonl(一行一条,方便我们分析)。

# 分别导出三类日志
fflog general --all --format jsonl > /tmp/general.jsonl
fflog manager --all --format jsonl > /tmp/manager.jsonl
fflog system --all --format jsonl > /tmp/system.jsonl

导出后可以用 wc -l 确认每个文件有多少条:

wc -l /tmp/general.jsonl
# 1672 /tmp/general.jsonl

文件内容长这样(一行一条 JSON):

{"time":"2026-09-20T17:47:58.972+08:00","level":"info","logger":"node-service","core_name":"sub05","caller":"OS/node_deploy.go:128","msg":"部署成功: 127.0.0.1:5005"}

再用电脑把文件拷回来(把 <aBMC 管理 IP> 换成实际地址):

scp bmc@<aBMC 管理 IP>:/tmp/general.jsonl .

也可以直接通过 aBMC 的文件共享把文件取回电脑。

收集建议

反馈问题时,请一并告诉我们:故障大概发生在什么时间、设备型号和固件版本。日志的时间范围尽量覆盖故障前后,越完整越好定位。

附录:fflog 命令速查

上面是「按场景用」,下面是「完整手册」。日常其实只需记住三条命令(fflog general / fflog manager / fflog system)和几个常用参数。

三类日志

日志类型简单理解命令别名
通用日志设备平时都干了什么:程序启动、模块运行、内部报错fflog generalfflog g
管理日志谁通过网页或接口操作过设备:操作人、请求地址、结果、耗时fflog managerfflog m
系统日志硬件的「身体状况」:温度、电压、风扇等fflog systemfflog s

日志级别由低到高:debug(调试) < info(正常) < warn(警告) < error(错误)。不带参数时默认显示最新 10 条,并按时间从早到晚排列。

常用选项

选项说明
-n, --limit N选取最新的 N 条记录,默认 10,N 为正整数。
--all输出全部匹配记录,与 -n/--limit 互斥。
-r, --reverse反转展示顺序(由新到旧)。
--since TIME从指定时间开始查询,包含边界。
--until TIME查询到指定时间之前,不包含边界。
--today查询当天零点至当前时刻,与 --since、--until 互斥。
-l, --level LEVELS精确匹配级别,多个用逗号分隔,如 warn,error。
--min-level LEVEL匹配不低于该严重程度的日志,如 --min-level warn。
-w, --where EXPR按字段筛选,可重复,多个条件按 AND 组合。
-f, --follow只持续输出命令启动后新入库的日志。
--interval DURATIONfollow 的轮询间隔,默认 500ms,范围 100ms 至 1m。
--format FORMAT输出格式,支持 compact(默认)和 jsonl。
--fields FIELDS只输出指定字段,并保持给定顺序。
--exclude-fields FIELDS从默认字段中排除指定字段。
--delimiter TEXT设置 compact 的字段分隔符,\t 表示制表符。
--header在首条 compact 记录前输出一次字段名。
--no-color关闭 level 字段的颜色显示。

--all 与 -n/--limit 互斥,--level 与 --min-level 互斥,--fields 与 --exclude-fields 互斥;--follow 不能与 -n、--all、--reverse、--since、--until、--today 同时使用。

专用筛选项

日志类型专用选项(多个用逗号分隔)
general--core(子板名)、--logger(模块)
manager--category、--user、--status(状态码)
system--core(子板名)

时间筛选

--since 支持两类写法:

  • 相对时间:正整数加小写单位 s、m、h、d,例如 30s、15m、2h、1d(d 固定为 24 小时);
  • 本地绝对时间:YYYY-MM-DD 或 YYYY-MM-DD HH:MM。

--until 只接受本地绝对时间。时间范围为半开区间:--since 包含起点,--until 不包含终点。所有时间均按设备本地时区解释与显示。

fflog general --since 30m
fflog manager --since "2026-09-23 08:00" --until "2026-09-23 12:00" --all

按字段筛选(--where)

格式为 字段 操作符 值,字段与操作符之间可以有空格。字符串字段支持 =、!=、~(包含)、!~(不包含);数字字段支持 =、!=、>、>=、<、<=。多条 --where 始终按 AND 组合。

日志类型字符串字段数字字段
generallogger、core_name、caller无
managercategory、username、client、method、pathstatus_code、latency_ms
systemlog_id、core_name、entry_type、sensor_typesensor_number
fflog manager --all --where "status_code >= 400"
fflog manager --where "path~/redfish"
fflog manager --where "latency_ms>=30"

字段值本身包含逗号时,请改用 --where 而非列表选项,例如 --where "logger=machine,network"。

输出格式与字段

  • compact(默认):每条日志一行,字段之间用空格分开,适合直接看;空值显示为 -。
  • jsonl:一行一条 JSON,适合导出和程序分析。导出给技术支持时建议用它。
{"time":"2026-09-23T09:28:22.771+08:00","level":"info","logger":"service-manager","core_name":"sub05","caller":"transaction/job.go:172","msg":"started vnc"}

想自己加个表头方便对照,可以自定义分隔符并开启表头:

fflog manager --header --fields time,status_code,msg --delimiter " | "
time | status_code | msg
2026-09-23 10:24:17.685 | 200 | Successfully obtained date and time

三类日志的默认字段:

日志类型一行日志里依次是
general时间、级别、logger、core_name、caller、内容
manager时间、级别、category、username、client、method、path、status_code、latency_ms、内容
system时间、级别、log_id、core_name、entry_type、sensor_type、sensor_number、内容

只保留或去掉某几个字段时,用 --fields(只保留)或 --exclude-fields(去掉),例如:

fflog general --fields time,level,msg

常见问题

Q:查询结果什么都没有? 默认只显示最新 10 条,同时受筛选条件限制。可以先去掉筛选,或加上 --all,或把 --since 的时间范围放宽再试。

Q:提示数据库或数据表不存在? 请确认设备上的 aBMC 服务运行正常,并且当前固件版本支持要查询的日志类型。

Q:显示的时间和我预期的不一样? 所有时间都按设备本地时区显示。如果设备时间不准,请先在 aBMC Web 里校准系统时间,再重新查询。

Q:参数太多,记不住怎么办? 直接运行 fflog 可以看到下面这些帮助信息,或运行 fflog general --help 查看某类日志的参数。

查询 Firefly BMC 日志

用法:
  fflog [命令] [选项]

可用命令:
  general     查询 general 日志
  help        显示命令帮助
  manager     查询 manager 日志
  system      查询 system 日志

选项:
  -h, --help      显示帮助
  -v, --version   显示版本

本页目录