作者实战经验总结,基于 ASG Manager V200R001C00SPC100 + ASG5305 设备。
前言:文章是AI总结。总体解决问题思路就是查各种日志,看报错。主要是要看worker日志。由于现在不做开发了。也不想加载原包到开发工具里面去调试。就全程让AI(openclaw)。抓日志分析,搞了好几天。用的minimax3.0,多少有点蠢。不过最后还是找到解决方法了。我折腾主要还是想搞清楚问题在那里。
如果各位不想折腾也可以直接用软件自带的datacenter_upgrade.sh直接修复。还不行就直接remove.sh再setup.sh。简单粗暴。我主要是出现这个问题还是有2-3次了,问题还不太一样。
网上关于asg-manager的文章也比较少,所以想着发出来,给遇到问题的朋友一个思路。

【核心结论】
ASG Manager 镜像日志接收链路 = 设备 syslog → 服务器网卡 → Pcap4j 抓包 →
Storm 拓扑 → ClickHouse 落库 → Web 控制台展示。
任意环节断开都会导致"控制台看不到日志"。
================================================================
一、ASG Manager 架构与日志流转链路
================================================================
【1.1 软件组件全景:8 个核心组件】
┌─────────────┬──────────────────────────────────┬──────────────┬─────────────┐
│ 组件 │ 路径 │ 端口 │ 作用 │
├─────────────┼──────────────────────────────────┼──────────────┼─────────────┤
│ Zookeeper │ /home/datacenter/zookeeper/ │ 2181 │ 分布式协调 │
│ MySQL │ 系统服务 │ 3306 │ 元数据 │
│ Clickhouse │ /usr/local/sbin/clickhouse/ │ 8123/9000/ │ 日志/流量 │
│ │ │ 9009 │ 列式存储 │
│ Storm │ /home/datacenter/storm/bin/ │ 6627(Nimbus) │ 实时流处理 │
│ Nimbus/UI │ │ 8080(UI) │ 调度+监控 │
│ Storm │ 同上 │ 6700+ │ Worker 进程 │
│ Supervisor │ │ (slot) │ │
│ Tomcat × 6 │ /home/datacenter/tomcat-{ums, │ 28880 等 │ Web 服务 │
│ │ cas,xxl,manager,datacenter,webui}│ │ │
│ Nginx │ 系统服务 │ 80/443 │ 反向代理 │
│ JDK │ /usr/lib/jdk1.8.0_171 │ — │ Java 运行时 │
└─────────────┴──────────────────────────────────┴──────────────┴─────────────┘
【1.2 完整日志流转链路:排查的核心地图】
ASG5305 设备 (192.168.1.8)
│
│ ① UDP syslog (端口 514)
▼
服务器 p8p1 网卡(物理层抓包)
│ tcpdump -i any 'udp port 514' 可直接抓到
▼
Pcap4j Java JNI 包装层
│ libpcap 1.5.3 系统库调用
│ Pcaps.getDevByName("p8p1") → PcapNetworkInterface 对象
▼
PcapUtil.init(String name) [com.abt.totems.common.PcapUtil]
│ 用 NIF.getName() 构造 PcapHandle.Builder
│ .snaplen(PCAP4J_SNAPLEN).promiscuousMode(PROMISCUOUS)
│ .timeoutMillis(PCAP4J_TIMEOUT).bufferSize(PCAP4J_BUFFER_SIZE)
│ .build() → PcapHandle
│ .setFilter("udp and dst port 514", OPTIMIZE)
│ 启动 pcapThread (Thread.start)
▼
PCAP4J_SPOUT (Storm spout)
│ PcapHandle.loop(-1, lambda) ← 持续抓包
│ 每个 packet → rawData (byte[])
│ 放入 LOG_QUEUE (ConcurrentLinkedQueue)
▼
LOG_TYPE_SPLIT_BOLT → 分类
│ http_get / http_post / dns / ftp / telnet /
│ user_account / search_engine / mail
▼
各类 PARSE_BOLT(解析)
│ TRAFFIC_SESSION_PARSE_BOLT → 流量会话
│ ACTION_LOG_PARSE_BOLT → 行为日志
│ ALARM_LOG_PARSE_BOLT → 告警日志
│ DEVICE_HEALTH_PARSE_BOLT → 设备健康
│ DEVICE_TRAFFIC_PARSE_BOLT → 设备流量
│ WEB_ACCESS_PARSE_BOLT → Web 访问
▼
Clickhouse (端口 8123/9000/9009)
│ src_device_traffic_log (原始流量日志)
│ src_statistic_traffic_log (统计流量)
│ src_web_access_log (Web 访问原始)
│ src_security_audit_log (安全审计原始)
│ dm_* (聚合表,每 5 分钟)
▼
ASG Manager Web 控制台
│ Tomcat × 6 + Nginx 反向代理
│ 端口:8443 / 8444 / 28880 / 8080 / ...
▼
最终展示给管理员
================================================================
二、故障排查标准化流程(先快后准)
================================================================
【2.1 第一步:确认基础链路(30 秒定位)】
目的:判断"链路断在哪一层"。
# 1.1 看 syslog 是否从设备发出 + 是否到达服务器
timeout 5 tcpdump -i any -c 3 'udp port 514'
期望看到:
IP 192.168.1.8.syslog > ...syslog: SYSLOG ...
看不到 → 设备端没发 / 网络断 / 网卡没接
# 1.2 看 8 个核心组件端口监听状态
ss -tlnp | grep -E ":2181|:3306|:8123|:9000|:9009|:6627|:8080|:28880"
期望:8 个端口都 LISTEN
缺哪个 → 对应组件没启动
# 1.3 看 Storm worker 是否在抓包
LATEST=$(find /home/datacenter/storm/logs/workers-artifacts \
-name worker.log -type f -exec ls -lt {} + | head -1 | awk '{print $NF}')
tail -5 "$LATEST" | grep "PCAP_COUNT_LONG"
期望:看到 "PCAP_COUNT_LONG: <递增的数字>"
永远是 0 → PcapUtil 抓包循环没起来(问题在第 ②③④⑤⑥ 层)
【2.2 第二步:定位"组件级"故障(2 分钟)】
根据 2.1 的结果决定深入哪里:
┌──────────────────────────────┬──────────────┬─────────────┐
│ 2.1 结果 │ 故障层 │ 跳到章节 │
├──────────────────────────────┼──────────────┼─────────────┤
│ tcpdump 抓不到 syslog 包 │ ① 设备/网络 │ 2.3.1 │
│ 8 端口有缺 │ 组件没启动 │ 2.3.2 │
│ PCAP_COUNT_LONG 永远 0 │ ②③④⑤⑥ 抓包│ 2.3.3 │
└──────────────────────────────┴──────────────┴─────────────┘
【2.3 各层故障详细排查】
【2.3.1 设备/网络层(syslog 收不到)】
# 确认网卡状态
ip -br link show
ip -d link show p8p1 # 替换成你的网卡名
期望:state UP, <BROADCAST,MULTICAST,UP,LOWER_UP>
卡 down → ifup p8p1
# 确认网卡名(用 pcap4j 看到的名字才是准确的)
cat > /tmp/ListNif.java << 'JAVA_EOF'
import org.pcap4j.core.*;
import java.util.List;
public class ListNif {
public static void main(String[] args) throws Exception {
List<PcapNetworkInterface> devs = Pcaps.findAllDevs();
for (int i = 0; i < devs.size(); i++) {
PcapNetworkInterface nif = devs.get(i);
System.out.println("[" + i + "] name='" + nif.getName() + "'");
}
}
}
JAVA_EOF
JAR=/home/datacenter/storm/data/supervisor/stormdist/$(ls /home/datacenter/storm/data/supervisor/stormdist/ | head -1)/stormjar.jar
cd /tmp/listnif && javac -cp $JAR ListNif.java && java -cp $JAR:. ListNif
【2.3.2 组件没启动(端口缺失)】
按启动顺序排查(启动顺序很重要,错一步后面都白搭):
# 完整启动顺序(顺序不可颠倒)
sh /home/datacenter/init/CentOS/datacenter_startup.sh
内部依次启动:
1. Zookeeper (2181)
2. MySQL (3306)
3. Clickhouse (8123/9000/9009)
4. Storm nimbus + ui + supervisor (6627/8080)
5. Tomcat × 6 (ums → cas → xxl → manager → datacenter → webui)
6. Nginx
7. Monit (看门狗)
启动失败的"卡点"对应故障组件,看启动日志的"卡在哪一步"即可定位。
【2.3.3 抓包链路故障(PcapUtil 层)】
核心:检查 Storm worker.log 的 3 个关键字
WLOG=/home/datacenter/storm/logs/workers-artifacts/$(ls /home/datacenter/storm/data/supervisor/stormdist/ | head -1)/6700/worker.log
grep -E "Pcap4J successfully loaded|NIF\(s\) found|Opened spout|Starting loop|设备名称不正确|获取网络接口失败|_handle为null" "$WLOG" | head -10
[3 个关键字状态对照表]
┌──────────────────────────────────────────────────┬────────────────────┐
│ 关键字 │ 含义/状态 │
├──────────────────────────────────────────────────┼────────────────────┤
│ Pcap4J successfully loaded a native pcap library│ ✅ 加载成功 │
│ 7 NIF(s) found │ ✅ 网卡枚举成功 │
│ Opened spout PCAP4J_SPOUT │ ✅ spout 组件加载 │
│ PcapHandle Starting loop │ ✅ 抓包循环启动 │
│ 设备名称不正确,获取网络接口失败 │ ❌ getDevByName 返回 │
│ │ null │
│ 获取网络接口失败 │ ❌ 抛 PcapNative │
│ │ Exception │
│ _handle为null │ ❌ 没成功打开 handle│
└──────────────────────────────────────────────────┴────────────────────┘
【3 种报错的修复方法】
─────────────────────────────────────
报错 A:设备名称不正确
─────────────────────────────────────
根因:pcap4j 通过 getDevByName("p8p1") 找不到该名字的网卡。
修复:重新选择正确的网卡名
# 这个脚本会自动:列网卡 → 选择 → 写 /etc/profile → kill topology → 重新提交
sh /home/datacenter/init/log_interface.sh
# 交互输入对应网卡的数字
─────────────────────────────────────
报错 B:获取网络接口失败
─────────────────────────────────────
根因:libpcap native 调用抛异常(权限/库版本/网卡状态问题)
修复:
# 1. 确认 supervisor 是 root(libpcap 需要 root 或 CAP_NET_RAW)
ps aux | grep supervisor | grep -v grep
# 2. 确认 libpcap 系统库存在
ls -la /usr/lib64/libpcap.so*
# 3. 确认 java.library.path 包含 native 库搜索路径
# Storm 启动时会从以下路径查找:
# /home/.../resources/Linux-amd64:
# /home/.../resources:
# /usr/local/lib:/opt/local/lib:/usr/lib
# 4. 重新提交 topology 清掉 supervisor 脏状态
sh /home/datacenter/init/log_interface.sh
─────────────────────────────────────
报错 C:_handle为null
─────────────────────────────────────
根因:上述 A 或 B 的后续,handle 没成功打开。
修复:同 A 或 B(修复后 handle 会自动重试)
================================================================
三、完整脚本(可直接复用)
================================================================
【3.1 ASG Manager 综合排查脚本】
#!/bin/sh
# asg-diagnose.sh — ASG Manager 一键综合排查脚本
# 用途:30 秒定位"控制台看不到日志"的故障层
# 用法:上传到 ASG Manager 服务器后
# sh asg-diagnose.sh
# 或 chmod +x asg-diagnose.sh && ./asg-diagnose.sh
# 适配:ASG Manager V200R001/V200R002 系列,默认部署路径 /home/datacenter/
# 兼容性:自动探测 jdk/clickhouse-client 路径,不依赖特定安装位置
#
# 输出:
# [1/6] syslog 是否到达服务器
# [2/6] 8 个核心端口监听状态
# [3/6] pcap4j NIF 列表(网卡真实名字)
# [4/6] Storm worker 状态(PCAP_COUNT_LONG + 启动期关键字)
# [5/6] Clickhouse 原始日志表最新数据
# [6/6] 故障层定位总结
echo "=========================================="
echo " ASG Manager 链路综合诊断"
echo " 时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
# === 探测关键依赖路径(避免硬编码)===
# jdk 路径探测
JDK_HOME=""
for p in /usr/lib/jdk1.8.0_171 /usr/lib/jvm/java-1.8.0-openjdk /usr/lib/jvm/java-8-openjdk /usr/lib/jvm/default-java /opt/jdk1.8.0_171 /usr/java/jdk1.8.0_171; do
if [ -x "$p/bin/javac" ]; then
JDK_HOME="$p"
break
fi
done
if [ -z "$JDK_HOME" ]; then
JDK_HOME=$(dirname $(dirname $(readlink -f $(which javac 2>/dev/null) 2>/dev/null)) 2>/dev/null)
fi
# clickhouse-client 路径探测
CLICKHOUSE_CLIENT=""
for p in /usr/local/sbin/clickhouse/clickhouse-client /usr/bin/clickhouse-client /usr/local/bin/clickhouse-client; do
if [ -x "$p" ]; then
CLICKHOUSE_CLIENT="$p"
break
fi
done
if [ -z "$CLICKHOUSE_CLIENT" ]; then
CLICKHOUSE_CLIENT=$(which clickhouse-client 2>/dev/null)
fi
# ASG Manager 默认部署路径(华为官方固定)
ASG_HOME="/home/datacenter"
echo "[1/6] 设备 syslog 是否到达服务器"
echo "----------"
timeout 5 tcpdump -i any -c 3 'udp port 514' 2>&1 | head -10
echo ""
echo "[2/6] 8 个核心端口监听状态"
echo "----------"
ss -tlnp 2>/dev/null | grep -E ":2181|:3306|:8123|:9000|:9009|:6627|:8080|:28880" | awk '{print " 端口:", $4, " 进程:", $6}'
echo ""
echo "[3/6] pcap4j NIF 列表(用 NIF 实际名字判断)"
echo "----------"
TOPO=$(ls -t "$ASG_HOME/storm/data/supervisor/stormdist/" 2>/dev/null | head -1)
if [ -z "$TOPO" ]; then
echo " ❌ 找不到 $ASG_HOME/storm/data/supervisor/stormdist/ 目录"
else
echo " 最新 topology: $TOPO"
JAR="$ASG_HOME/storm/data/supervisor/stormdist/${TOPO}/stormjar.jar"
if [ ! -f "$JAR" ]; then
echo " ❌ 找不到 jar: $JAR"
else
echo " jar: $JAR ($(ls -lh $JAR | awk '{print $5}'))"
echo ""
if [ -z "$JDK_HOME" ]; then
echo " ⚠️ 未找到 JDK,跳过 pcap4j NIF 列表(请确认 java/javac 已安装)"
else
echo " jdk: $JDK_HOME"
mkdir -p /tmp/asg-listnif
cat > /tmp/asg-listnif/ListNif.java << 'JAVA_EOF'
import org.pcap4j.core.*;
import java.util.List;
public class ListNif {
public static void main(String[] args) throws Exception {
List<PcapNetworkInterface> devs = Pcaps.findAllDevs();
System.out.println(" Total NIFs: " + devs.size());
for (int i = 0; i < devs.size(); i++) {
PcapNetworkInterface nif = devs.get(i);
System.out.println(" [" + i + "] name='" + nif.getName() + "' desc='" + nif.getDescription() + "'");
}
}
}
JAVA_EOF
cd /tmp/asg-listnif
$JDK_HOME/bin/javac -cp "$JAR" ListNif.java 2>&1 | head -5
$JDK_HOME/bin/java -cp "$JAR:." ListNif 2>&1 | grep -E "Total NIF|name="
fi
fi
fi
echo ""
echo "[4/6] Storm worker 状态(启动期关键字 + 最近 PCAP_COUNT_LONG)"
echo "----------"
if [ -n "$TOPO" ]; then
WLOG="$ASG_HOME/storm/logs/workers-artifacts/${TOPO}/6700/worker.log"
if [ ! -f "$WLOG" ]; then
echo " ❌ 找不到 worker.log: $WLOG"
else
echo " worker.log: $WLOG"
echo ""
echo " --- 启动期关键日志 ---"
grep -E "Pcap4J successfully loaded|NIF\(s\) found|Opened spout|Starting loop|设备名称不正确|获取网络接口失败|_handle为null" "$WLOG" 2>/dev/null | head -8 | sed 's/^/ /'
echo ""
echo " --- 最近 5 行 PCAP_COUNT_LONG ---"
tail -5 "$WLOG" 2>/dev/null | grep "PCAP_COUNT_LONG" | sed 's/^/ /'
fi
fi
echo ""
echo "[5/6] Clickhouse 原始日志表最新数据"
echo "----------"
if [ -z "$CLICKHOUSE_CLIENT" ] || [ ! -x "$CLICKHOUSE_CLIENT" ]; then
echo " ⚠️ 未找到 clickhouse-client(请确认 clickhouse 服务安装位置)"
echo " 手动查询方法:找到 clickhouse-client 后执行:"
echo " clickhouse-client --query \"SELECT table, MAX(send_time) FROM ("
echo " SELECT 'src_device_traffic_log' as table, send_time FROM totems.src_device_traffic_log"
echo " UNION ALL SELECT 'src_web_access_log', send_time FROM totems.src_web_access_log"
echo " UNION ALL SELECT 'src_security_audit_log', send_time FROM totems.src_security_audit_log"
echo " ) GROUP BY table\""
else
echo " clickhouse-client: $CLICKHOUSE_CLIENT"
$CLICKHOUSE_CLIENT --query "
SELECT
table,
MAX(send_time) AS latest_send_time,
toUnixTimestamp(now()) - MAX(send_time)/1000 AS seconds_ago
FROM (
SELECT 'src_device_traffic_log' as table, send_time FROM totems.src_device_traffic_log
UNION ALL SELECT 'src_web_access_log', send_time FROM totems.src_web_access_log
UNION ALL SELECT 'src_security_audit_log', send_time FROM totems.src_security_audit_log
)
GROUP BY table
ORDER BY seconds_ago ASC
" 2>&1 | sed 's/^/ /'
fi
echo ""
echo "[6/6] 故障层定位总结"
echo "----------"
echo " - syslog 收不到 → ① 设备/网络层(检查 ASG 设备 syslog 配置)"
echo " - 端口缺 → 组件没启动($ASG_HOME/init/CentOS/datacenter_startup.sh)"
echo " - PCAP_COUNT_LONG=0 → ②③④⑤⑥ 抓包链(看 4/6 输出的关键字)"
echo " - 表无新数据 → Storm bolt 解析/写入问题(看 supervisor 日志)"
echo " - 表有数据但控制台无 → Tomcat/Nginx Web 层问题"
echo ""
echo "=========================================="
echo " 诊断完成: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
【3.2 修复脚本:重新选择网卡】
# 一行命令修复 PcapUtil "设备名称不正确" 问题
sh /home/datacenter/init/log_interface.sh
# 交互选网卡号(看自动列出的列表)
【3.3 重启 ASG Manager 整套服务】
# 完整重启(启动顺序固定)
sh /home/datacenter/init/CentOS/datacenter_shutdown.sh # 等 "Manager stopped."
sleep 30
sh /home/datacenter/init/CentOS/datacenter_startup.sh # 等 "Manager started."
================================================================
四、实战案例(故障 → 定位 → 修复)
================================================================
【案例:控制台看不到新数据】
─────────────────────────────────────
Step 1:综合诊断(30 秒)
─────────────────────────────────────
运行:sh asg-diagnose.sh
输出关键信息:
syslog 到达 ✅ tcpdump 抓到
8 端口全开 ✅
pcap4j 7 NIFs found ✅
但 worker.log 报错 ❌ 设备名称不正确
PCAP_COUNT_LONG ❌ 永远是 0
─────────────────────────────────────
Step 2:定位故障层
─────────────────────────────────────
故障层 = ④ PcapUtil.init() → getDevByName 失败
─────────────────────────────────────
Step 3:修复
─────────────────────────────────────
sh /home/datacenter/init/log_interface.sh
# 选择 p8p1 对应的数字
# 脚本自动执行:
# 1. storm kill PcapLogParseTopology -w 10
# 2. sleep 40
# 3. storm jar storm-1.0-SNAPSHOT.jar com.abt.totems.PcapLogParseTopology p8p1
─────────────────────────────────────
Step 4:验证修复
─────────────────────────────────────
WLOG=$(find /home/datacenter/storm/logs/workers-artifacts \
-name worker.log -type f -exec ls -lt {} + | head -1 | awk '{print $NF}')
tail -20 "$WLOG" | grep "PCAP_COUNT_LONG"
期望:数字持续增长(每 10 秒 +150~200)
─────────────────────────────────────
修复时间
─────────────────────────────────────
从综合诊断到修复成功 = 5 分钟
================================================================
五、ASG Manager 常用命令速查表
================================================================
┌────────────────────┬──────────────────────────────────────────────┐
│ 用途 │ 命令 │
├────────────────────┼──────────────────────────────────────────────┤
│ 看 storm 进程数 │ ps aux | grep storm | wc -l (正常 = 6) │
│ 启动整套服务 │ sh /home/datacenter/init/CentOS/ │
│ │ datacenter_startup.sh │
│ 停止整套服务 │ sh /home/datacenter/init/CentOS/ │
│ │ datacenter_shutdown.sh │
│ ★ 更换日志接收网卡 │ sh /home/datacenter/init/log_interface.sh │
│ 看 worker.log │ tail -f /home/datacenter/storm/logs/ │
│ │ workers-artifacts/<最新目录>/6700/ │
│ │ worker.log │
│ 看 Clickhouse 端口 │ ss -tlnp | grep -E ":8123|:9000|:9009" │
│ 反编译 PcapUtil │ unzip -p <stormjar.jar> com/abt/totems/ │
│ │ common/PcapUtil.class > /tmp/P.class && │
│ │ /usr/lib/jdk1.8.0_171/bin/javap -c -p │
│ │ /tmp/P.class │
└────────────────────┴──────────────────────────────────────────────┘
================================================================
六、关键经验总结
================================================================
【6.1 必须建立"日志流转地图"的概念】
排查任何"看不到日志"的问题,第一步不是猜原因,而是:
1. 画出完整日志流转链路(设备 → 抓包 → Storm → DB → Web)
2. 在每个节点上做一次"心跳检测"
3. 第一个失败的节点 = 根因所在
【6.2 三个黄金关键字】
worker.log 里只关注这 3 个关键字:
- "设备名称不正确" → 网卡找不到 → 跑 log_interface.sh
- "获取网络接口失败" → native 调用异常 → 检查 libpcap 权限/版本
- "_handle为null" → 前两者的后续 → 重新跑 log_interface.sh
【6.3 PCAP_COUNT_LONG 是"流量计"】
- 持续增长(每 10 秒 +150~200)= 数据流正常 ✅
- 永远是 0 = PcapUtil 抓包链断了 ❌
- 不增长但不为 0 = 上游有数据但下游处理卡了
【6.4 反编译是终极武器】
当 log_interface.sh 修不好时,反编译看代码:
JAR=/home/datacenter/storm/data/supervisor/stormdist/<最新目录>/stormjar.jar
unzip -p "$JAR" com/abt/totems/common/PcapUtil.class > /tmp/P.class
/usr/lib/jdk1.8.0_171/bin/javap -c -p /tmp/P.class
字节码告诉你:
- Pcaps.getDevByName 调用位置
- 异常处理路径(catch 块 vs null 检查)
- 实际报错触发哪个分支
================================================================
七、附:环境信息
================================================================
ASG Manager 版本 V200R001C00SPC100
设备型号 ASG5305(已 EOFS)
服务器 OS CentOS 7.4 / 内核 3.10.0-514.el7.x86_64
JDK /usr/lib/jdk1.8.0_171 (PATH 没配)
libpcap /usr/lib64/libpcap.so.1.5.3
Storm 1.1.2
Clickhouse (8123/9000/9009)
Tomcat 6 个独立实例
Pcap4j 1.x
最后:这个asg-diagnose.sh脚本,大家直接复制用的话可能会报错,得根据自己的环境改。其实核心的上面也说了,就是要看storm日志,Tomcat-datacenter日志,clickhouse日志(需要改启动脚本,输出日志,默认没输出(非关键)),tomcat-manager日志。以及最关键的worker.log。

991

被折叠的 条评论
为什么被折叠?



