第三章 日志采集方法: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就派上用场了。

具体操作分三步:

  1. 设备侧配置FTP服务——说白了就是让设备当个文件服务器
  2. 指定日志文件路径——你得知道日志存在哪个目录下
  3. 客户端拉取——用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
注意!FTP是明文传输的,密码直接在网络上裸奔。我曾经在客户机房做割接,隔壁工位的兄弟用Wireshark一抓包,我的设备密码全暴露了。从那以后,我坚持用SFTP——虽然配置麻烦点,但安全第一。

SFTP的配置大同小异,只是端口从21变成了22,底层走的是SSH加密通道。你想想看,运维日志里可能包含客户信息、网络拓扑、IP地址,这些要是被截获了,后果你懂的。

3.3 网管系统批量导出——大厂都在用的方式

如果你管理的设备超过50台,还一台台去连FTP?效率太低了。这时候就该上网管系统了。

主流厂家的网管系统都支持日志批量导出:

  • 华为U2000/NCE:性能管理 → 日志管理 → 选择网元 → 导出CSV
  • 中兴NetNumen:告警管理 → 日志查询 → 批量导出
  • 烽火OTNM2000:系统管理 → 日志归档 → 选择时间段 → 导出

我个人建议,导出时注意三点:

  1. 时间范围别太大——一次导一个月的数据,文件可能几百兆,打开都费劲
  2. 选择关键字段——时间、网元名称、告警级别、告警原因,这四个字段必选
  3. 导出格式选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,结果半夜割接时手忙脚乱。灵活搭配,才是王道。

下一章咱们聊聊日志解析——拿到原始日志后,怎么从一堆乱码里找到真正有用的信息。到时候我会分享几个我压箱底的解析技巧,保证让你少走弯路。