第三章 日志采集方法:CLI命令行采集、FTP/SFTP远程采集、网管系统批量导出、自动化脚本采集
日志采集这事儿,说白了就是「怎么把设备里的日志搞出来」。很多兄弟觉得这步简单,不就是敲几条命令嘛?但我在项目里见过太多因为采集方式不对,导致日志不全、时间戳错乱、甚至把设备搞挂了的案例。嗯,咱们今天就把这四种主流方法掰开揉碎了讲清楚。
3.1 CLI命令行采集——最原始也最可靠
CLI采集,我个人习惯叫它「手搓模式」。你想想看,当网管系统挂了、FTP连不上、自动化脚本还没部署的时候,你唯一能靠的就是手里这根串口线或者SSH会话。
常用的命令就那么几条,我列个表大家存一下:
| 设备类型 | 日志采集命令 | 说明 |
|---|---|---|
| 华为OSN系列 | display logbuffer |
查看当前缓存日志 |
| 中兴M系列 | show logging |
显示系统日志 |
| 烽火系列 | log show |
查看日志记录 |
| 通用NE设备 | display trapbuffer |
查看告警日志 |
display clock 确认设备时间。为什么?因为日志时间戳如果不对,你后面分析全白干。我曾经有一次排查误码问题,折腾了三个小时才发现设备时间差了8个小时——那叫一个酸爽。
CLI采集的优点是「零依赖」,只要有终端就能干活。缺点也很明显——你得一条一条翻,遇到日志量大的设备,手都按酸了。所以它适合应急场景,或者采集少量关键日志。
3.2 FTP/SFTP远程采集——批量搬运的好手
当你要采集几十台设备的日志时,还靠CLI一条条敲?那不得累死。这时候FTP/SFTP就派上用场了。
具体操作分三步:
- 设备侧配置FTP服务——说白了就是让设备当个文件服务器
- 指定日志文件路径——你得知道日志存在哪个目录下
- 客户端拉取——用FileZilla、WinSCP或者直接命令行get
举个华为设备的例子:
<HUAWEI> system-view
[HUAWEI] ftp server enable
[HUAWEI] set default ftp-directory flash:/logfile/
[HUAWEI] local-user admin password cipher Huawei@123
[HUAWEI] local-user admin service-type ftp
[HUAWEI] local-user admin ftp-directory flash:/logfile/
然后在你的电脑上:
ftp 192.168.1.100
# 输入用户名密码
get log_20240101.tar.gz
bye
SFTP的配置大同小异,只是端口从21变成了22,底层走的是SSH加密通道。你想想看,运维日志里可能包含客户信息、网络拓扑、IP地址,这些要是被截获了,后果你懂的。
3.3 网管系统批量导出——大厂都在用的方式
如果你管理的设备超过50台,还一台台去连FTP?效率太低了。这时候就该上网管系统了。
主流厂家的网管系统都支持日志批量导出:
- 华为U2000/NCE:性能管理 → 日志管理 → 选择网元 → 导出CSV
- 中兴NetNumen:告警管理 → 日志查询 → 批量导出
- 烽火OTNM2000:系统管理 → 日志归档 → 选择时间段 → 导出
我个人建议,导出时注意三点:
- 时间范围别太大——一次导一个月的数据,文件可能几百兆,打开都费劲
- 选择关键字段——时间、网元名称、告警级别、告警原因,这四个字段必选
- 导出格式选CSV——Excel能直接打开,方便后续分析
避坑指南:我曾经在导出时勾选了「包含性能数据」,结果导出的文件里混了大量15分钟粒度的性能采样点,一个网元就有上万行。分析的时候Excel直接卡死。嗯,从那以后我导出前都会仔细看一遍选项。
3.4 自动化脚本采集——运维老鸟的终极武器
到了这个阶段,你已经不满足于手动操作了。写个脚本,定时跑,日志自动归档,这才是现代运维该有的样子。
我常用的脚本框架是这样的:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 日志自动采集脚本 - 适用于华为OSN设备
import paramiko
import datetime
import os
# 设备列表
devices = [
{'ip': '192.168.1.1', 'user': 'admin', 'pwd': 'Huawei@123'},
{'ip': '192.168.1.2', 'user': 'admin', 'pwd': 'Huawei@123'},
]
# 日志保存目录
log_dir = f"/data/logs/{datetime.date.today()}"
if not os.path.exists(log_dir):
os.makedirs(log_dir)
for dev in devices:
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(dev['ip'], username=dev['user'], password=dev['pwd'])
# 执行命令采集日志
stdin, stdout, stderr = ssh.exec_command('display logbuffer')
log_content = stdout.read().decode('utf-8')
# 保存到本地文件
filename = f"{log_dir}/{dev['ip']}_logbuffer.txt"
with open(filename, 'w', encoding='utf-8') as f:
f.write(log_content)
print(f"[OK] {dev['ip']} 日志采集完成")
ssh.close()
except Exception as e:
print(f"[FAIL] {dev['ip']} 采集失败: {str(e)}")
这个脚本虽然简单,但已经能解决80%的日常采集需求了。你想想看,把它放到crontab里每天凌晨2点跑一次,第二天上班直接看分析结果,多省心。
3.5 四种方法怎么选?我的一点经验
说了这么多,到底用哪种?我根据项目经验总结了个选择矩阵:
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 单台设备应急排障 | CLI命令行 | 最快,不需要任何前置条件 |
| 5-20台设备日常采集 | FTP/SFTP | 批量操作,可控性强 |
| 50台以上、有网管环境 | 网管系统导出 | 统一管理,审计合规 |
| 100台以上、需要长期归档 | 自动化脚本 | 省人力,可定制,可扩展 |
最后说一句:别迷信任何一种方法。我见过有人死磕自动化脚本,结果设备升级后命令变了,脚本全废。也见过有人永远只用CLI,结果半夜割接时手忙脚乱。灵活搭配,才是王道。
下一章咱们聊聊日志解析——拿到原始日志后,怎么从一堆乱码里找到真正有用的信息。到时候我会分享几个我压箱底的解析技巧,保证让你少走弯路。