尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Zabbix Ping监控实战:从ICMP探测到告警阈值设置

Zabbix Ping监控实战:从ICMP探测到告警阈值设置 1. 网络可达性监控为什么要从一条ping命令开始1.1 一次深夜故障给我的教训干运维这些年我印象最深的一次事故不是数据库宕机也不是磁盘写满而是一个很小的问题——核心交换机的一个接口松动导致整整一个网段的办公终端和设备全部失联。最尴尬的是这个故障持续了将近两个小时才被业务同事的电话捅到我这里来。为什么没有被第一时间发现因为那套环境里跑着CPU、内存、磁盘、服务进程的各种监控唯独没有人想到去做网络可达性探测。服务器本身没宕CPU也不高磁盘也正常zabbix上的所有监控项都显示绿色但实际上这个网段的机器已经从网络上消失了。那次之后我明白了一个道理监控体系里最基础、也最容易被忽略的恰恰是网络层这台设备还在不在、通不通的指标。ping监控要解决的就是这个问题。它不关心你的磁盘用了多少也不关心你的Nginx进程是否活着它只做一件事——定期向目标主机发送ICMP探测包确认这台机器在网络层面依然存在、依然可达。成本极低效果却极其直接是所有监控项目里投入产出比最高的一个。1.2 ping监控在监控体系里的定位在完整的监控架构里一般会分成网络层、主机层、应用层、业务层四个维度。主机层的CPU、内存、磁盘属于这台机器活得好不好的问题应用层的端口、进程、接口响应属于服务能不能用的问题而ping监控属于最前端的网络层——这台机器在网络里到底还在不在。它的定位很特殊它不依赖被监控主机上的任何agent进程只要网络路径通畅哪怕被监控的机器已经死机、系统崩溃、agent根本起不来zabbix server也能探测出这台机器失联了。这个特性让ping监控天然适合做其他所有监控的前置条件——主机都ping不通了CPU监控、进程监控即使有数据也失去了意义。Zabbix实现ping监控是一套非常成熟的方案。它原生支持ICMP探测不需要额外安装agent不需要在被监控端做任何配置只要你掌握了监控项的配置逻辑再批量套用模板几十台、上百台设备的网络可达性监控几十分钟就能铺完。这也是这篇文章想跟你分享的核心内容——从原理到落地从监控项到告警阈值一步步把zabbix的ping监控真正用起来。2. zabbix实现ping监控的三把钥匙icmpping、icmppingloss、icmppingsec2.1 三个键值的具体含义与参数拆解Zabbix本身不直接发起ICMP请求它是通过模板里预置的几个键值key来间接完成探测的。很多人第一次看到这几个key会懵觉得名字长得像但不知道区别我把它们拆开讲清楚。键值作用返回内容icmpping目标主机是否可达1可达/ 0不可达icmppingloss探测丢包率百分比数值如 0、50、100icmppingsec平均响应时间数值单位秒如 0.035三个键值配合起来就能从通不通、丢不丢包、响应快不快三个维度完整描述一条网络链路的健康状况。只做可用性监控可以只看icmpping要想知道网络质量好不好就必须把icmppingloss和icmppingsec一起加上。每个键值后面都跟了一串参数格式是icmpping[target,packets,interval,timeout,size]。我实际配置中最常用的组合是这样的icmpping[192.168.10.1,4,50,5000,128] icmppingloss[192.168.10.1,4,50,5000,128] icmppingsec[192.168.10.1,4,50,5000,128]这里每个参数都有实际意义target是要探测的目标地址可以是IP也可以是域名packets是每次探测发送的ICMP包数量我一般设4个太少偶然性大太多会拖慢采集interval是两次发包间隔的毫秒数50毫秒是个通用值timeout是单包超时时间单位毫秒设5000也就是5秒比较稳妥内网设短一点也行size是ICMP报文大小128字节足够没必要用默认的更大值。需要特别提醒的是zabbix的agent必须配置了Server参数允许接收来自server的采集请求否则这些键值虽然配置了agent端却不会执行。如果你用的是server端直接探测模式不经过agent那就要走后面的fping方案这点要分清楚。2.2 隐藏在底层的fping工具Zabbix的ICMP监控并不是自己实现了ICMP协议栈而是依赖了一个Linux下非常经典的工具——fping。zabbix server在5.0版本之后ICMP探测任务统一由server端自己fork出来的fping进程来干活。这也是很多新手配置完监控项后屏幕上出现一大片Not supported的根本原因服务器上根本没装fping或者装了但权限不对。在CentOS/Rocky Linux上安装很简单yum install -y fping装完之后有个非常关键的步骤很多人会漏掉——给fping设置setuid权限。因为ICMP原始套接字需要root权限才能创建而zabbix server进程通常以zabbix用户运行如果不给fping加setuid位zabbix用户调用fping时会直接报权限错误表现就是监控项一直不支持。chmod us /usr/bin/fping设置完后可以用ls -l /usr/bin/fping确认权限位正常情况下应该能看到s标志-rwsr-xr-x 1 root root 44168 Mar 10 01:23 /usr/bin/fping这一步做完zabbix icmp监控才算有了真正能干活的基础。我在6.0和7.0两个版本上都验证过不加setuid监控项十年也取不到数据。3. 从零部署环境准备阶段的三个关键坑3.1 server端和agent端的安装要点Zabbix部署方式很灵活生产环境我建议用源码编译或者官方rpm包测试环境直接用docker compose拉起一套zabbix server加上postgresql数据库就够用了。以7.0 LTS版本为例docker方式最省心docker run -d --name zabbix-server \ -e DB_SERVER_HOSTzabbix-db \ -e POSTGRES_USERzabbix \ -e POSTGRES_PASSWORDzabbix_pwd \ -e POSTGRES_DBzabbix \ -p 10051:10051 \ zabbix/zabbix-server-pgsql:alpine-7.0-latest但这里有个前提你在这台server上要能正常使用ICMP探测否则容器内部的权限和二进制文件都不可控。我更推荐在物理机或VM上装原生版本方便排查fping这类底层依赖问题。Agent端的安装相对简单装完之后最关键的是修改/etc/zabbix/zabbix_agentd.conf里的Server和ServerActive配置指向zabbix server的地址Server192.168.1.100 ServerActive192.168.1.100 Hostnameweb-server-01改完重启agent然后在zabbix web界面添加主机时agent就会过来主动注册或者被server采集了。很多教程到这里就结束了但实际部署中还有两个坑让你装了等于白装。3.2 fping的setuid权限问题前文已经点到了fping的权限问题这里我展开说。我遇到过不止一次这样的情况明明yum install fping装好了用root用户手动执行fping 192.168.1.1也正常返回结果但zabbix web界面上监控项就是红叉Not supported。点开监控项最近数据报错信息写着类似Permission denied或者fping: cant create socket。这就是setuid位没有设置。root用户执行fping没问题因为root本身有权限创建ICMP套接字但zabbix server是以zabbix用户身份启动的它去执行fping时如果fping没有setuid位进程权限不会提升仍然以zabbix用户的低权限运行创建ICMP原始套接字自然就失败了。这个问题在zabbix官方文档里其实有明确说明但因为它藏在安装文档的角落里我估计至少有一半的新手栽在这上面。建议执行完安装命令后顺手把setuid也设置了避免后续排查浪费大量时间。3.3 防火墙与路由监控项一直报UNREACHABLE的常见原因环境版本都装好了fping权限也对了但ping监控项开始采集后数据一直是0icmpping永远是0不可达。这时候很多人第一反应是目标主机的问题但实际排查下来最常见的三个原因都不是目标主机本身防火墙拦截了ICMP、zabbix server没有到目标网段的路由、目标禁ping。先说防火墙。zabbix server作为探测源它发出的ICMP请求是普通的数据包如果server自身或者中间的防火墙设备丢弃了ICMP流量结果就是永远不可达。排查方法很简单在server上手动执行ping -c 4 192.168.10.1如果手动ping不通那问题大概率在网络路径上而不是zabbix配置的问题。我遇到过最经典的案例是云厂商安全组默认只放行了TCP端口没有放行ICMP结果云服务器之间ping全部不通但业务流量一切正常。这种情况需要去云控制台调整安全组规则放行ICMP协议。再就是目标主机开启了防火墙且禁ping。常见的Linux发行版默认行为不同有的默认放行ICMP有的默认丢弃。检查方法是在目标机上执行iptables -L -n | grep icmp或者更简单直接看/proc/sys/net/ipv4/icmp_echo_ignore_all的值如果是1说明内核层面就丢弃了ICMP echo请求echo 0 /proc/sys/net/ipv4/icmp_echo_ignore_all但要注意如果你监控的是交换机、路由器这类网络设备有些设备管理地址默认不允许ping需要到设备上放通管理口的ICMP策略。4. 落地实操创建ping监控项、模板与图形4.1 用现成模板还是手写监控项Zabbix自带了一个名为Template Module ICMP Ping的模板里面预置了icmpping、icmppingloss、icmppingsec三个监控项以及配套的触发器。如果你的需求只是通不通、丢包率、响应时间这几个基础指标直接用这个模板是最省事的。但我个人并不建议生产环境直接套用官方模板不改动原因在于官方模板的触发器阈值偏向保守。官方模板对icmppingloss的触发器设置是 50丢包率超过50%才算警告这对很多内网核心链路来说太宽松了——丢包率到10%的时候业务其实已经能明显感觉到卡顿等到50%才报警黄花菜都凉了。所以更合理的做法是以官方模板为基础复制一份自定义模板然后按自己的业务容忍度调整阈值。这样既省去了从零写监控项的重复劳动又能让告警真正符合实际需求。4.2 主监控项的完整配置过程如果你决定手写监控项流程也不复杂。以我在zabbix 7.0里创建一个面向192.168.10.1网关的ping监控为例完整步骤如下。第一步在配置 → 主机里添加主机如果还没有的话。这里关键点在于由agent代理这一栏——如果你是在server端直接监控网络设备比如交换机就不需要通过agent可以直接留空或者选择无代理。但需要明确的是zabbix默认的ICMP监控项实际是由server端发起的即使主机类型里不关联agent也能通过模板里的键值正常采集前提是server上装了fping。第二步在主机详情页进入监控项选项卡点击创建监控项。关键字段我分别说明名称建议写清楚探测目标和指标比如ICMP ping 网关192.168.10.1 可达性类型选简单检查Simple check因为这种监控不依赖agent由server直接执行键值填icmpping[192.168.10.1,4,50,5000,128]信息类型选数字无符号整数更新间隔默认30秒。内网建议30秒外网链路建议60秒不要低于10秒否则fping进程会被频繁forkserver负载扛不住。第三步同样的方式创建另外两个监控项键值分别是icmppingloss[192.168.10.1,4,50,5000,128]和icmppingsec[192.168.10.1,4,50,5000,128]信息类型分别选浮点数和浮点数。三个监控项创建完后选中它们在底部批量更新里可以一次性设置创建触发器和创建图形效率会高很多。4.3 触发器与恢复表达式该怎么写监控项采集到数据只是第一步真正让ping监控发挥价值的是触发器。一个标准的ping监控触发器至少要包含失败判定和恢复判定两部分否则告警产生后不会自动关闭值班人员会被持续报警折磨。以丢包率为例我实际在用的触发器表达式是这样的last(/Template Module ICMP Ping/icmppingloss[192.168.10.1,4,50,5000,128]) 20含义是最近一次采样的丢包率超过20%就触发告警。考虑到偶发网络抖动还可以加上持续周期判定比如连续3次采样都超过20%才报警min(/Template Module ICMP Ping/icmppingloss[192.168.10.1,4,50,5000,128],#3) 20恢复表达式用对应的反向条件max(/Template Module ICMP Ping/icmppingloss[192.168.10.1,4,50,5000,128],#3) 20这样设计的好处是网络抖动几秒钟不会直接炸出一堆告警而一旦真的持续劣化告警必然触发。我见过很多团队把丢包率阈值写成0结果每过一段时间就被网络抖动骚扰一次最后值班人员直接把告警屏蔽了反而更危险。对于icmppingsec响应时间的触发器建议阈值根据你对链路的正常基线来定。内网核心设备我通常设 50ms警告、 100ms严重跨机房专线可以放宽到 100ms警告、 200ms严重。阈值设定前最好先用ping命令连续打几百个包记录正常响应时间分布再往上加一倍余量作为告警线这样最稳妥。5. 告警阈值设计别让值班同事被误报折磨5.1 丢包率、响应时间、可用性监控口径的选择在真正配置ping监控告警前我建议你先想清楚一个问题你的核心诉求是知道设备掉线还是知道网络质量变差如果只是设备掉线那icmpping这一个键值就够了。它的值是0或1触发器可以用last() 0来判定不可达。这个监控口径最直接误报的可能性也最小——毕竟目标主机确实ping不通了。但它的问题是网络质量劣化到一定程度但还没完全断的时候它什么都看不出来。如果想要感知网络质量劣化就需要同时关注丢包率icmppingloss和响应时间icmppingsec。我自己的经验是丢包率比响应时间更早反映链路问题。很多时候链路出现拥塞、光模块老化、光纤衰耗增大首先表现为丢包率缓慢爬升然后才是响应时间变长。所以如果你的环境允许只监控两个指标优先选丢失率和可达性。这里要专门提一个容易误导人的情况响应时间有时候会出现越ping越快的假象。原因是ICMP探测包在网络设备上是有优先级队列的某些设备会对ICMP流量做特殊处理优先转发导致响应时间看起来一直很漂亮但实际上业务流量已经堵死了。所以不要单独用响应时间作为网络质量的唯一评判标准要结合丢包率看。5.2 合理设置报警级别与依赖关系告警级别设置要匹配故障的紧急程度。我在生产环境里对ping监控的告警级别是这么划分的丢包率20%且持续3次采样警告级别群里同步运维同事关注丢包率50%或icmpping0严重级别需要立即处理同时影响多个目标不可达灾难级别大概率是上层链路或核心设备故障很多新手会把所有ping告警都设置成严重结果告警失去了层级真正出大事的时候反而被淹没在大量普通告警里。建议在zabbix的报警媒介配置里为不同级别设置不同的通知策略——警告级别只发即时通讯通知严重级别才开始打电话。另外zabbix的依赖关系功能很适合用在网络监控上。举个例子你同时监控了核心交换机192.168.10.1和它下挂的服务器192.168.10.10当交换机故障时服务器肯定也ping不通了。如果不设依赖关系你会同时收到几十条告警设了依赖关系后只要下挂设备的父级核心交换机告警了子设备的告警会被自动抑制只报最上层的根因。这个功能在zabbix里叫添加依赖实际使用效果非常明显。5.3 我踩过的告警风暴坑有一段时间我给一个机房的四十多台设备都配了ping监控更新间隔设的是30秒。结果某个周末一台核心接入交换机光模块故障整个机柜的设备全部失联我的手机上一下子涌进来四十多条告警。虽然依赖关系配了一部分但没配全告警轰炸了整整五分钟。后来我反思了这个事总结出三条经验第一告警必须做聚合不能一台设备一条独立告警。可以通过zabbix的问题抑制或者配置依赖关系来解决也可以借助外部告警平台如Alertmanager做分组。第二恢复通知一定要配否则你永远不知道故障是恢复了还是持续着。zabbix触发器里恢复表达式的意义就在于此。第三不要用默认的1分钟去评估持续不可达。网络里有很多临时性抖动比如链路切换、STP收敛、设备重启一两分钟内ping不通是正常的。我的做法是把icmpping0的触发器加上时间条件比如连续5个周期都不可达才告警min(/Template Module ICMP Ping/icmpping[192.168.10.1,4,50,5000,128],#5)0这样既不会漏报也不会因为瞬断就疯狂骚扰。6. 可视化展示把网络状态变成一眼能看懂的图6.1 用zabbix原生图形拼出一张网络状态面板监控数据采集了、告警也触发了但如果你打开zabbix只看到一堆数字表格工作效率依然不高。网络监控必须配可视化让你扫一眼就能判断所有链路的健康状态。Zabbix的图形功能可以做最简单的折线图、面积图。我在每个主机的图形配置里都会把三个ping指标放在同一张图上左边Y轴显示丢包率百分比右边Y轴显示响应时间秒数这样一张图同时能看到可达性和延迟变化趋势。配置方法是在主机 → 图形 → 创建图形把三个监控项全选进去图形类型选多边形或线都行。不过单台设备的图形看得再细也解决不了整体态势感知的问题。我更推荐做好两件事一是把zabbix首页的概览加入自定义仪表盘小组件按网段、机房、业务线把主机分组每组显示最新丢包率和响应时间二是利用zabbix的地图功能把全网的设备拓扑画出来在拓扑上叠加ICMP监控的状态色块——绿色代表正常黄色代表有丢包红色代表不可达。我自己做机房监控的时候会按机柜画拓扑地图。因为zabbix地图的核心就是维护元素主机或设备和链接设备之间的连线而链接上绑定的是监控项触发器。配置好之后一旦某条链路丢包超阈值地图上对应链路会直接变色值班人员用余光扫一眼大屏就能发现问题在哪比看几百条告警效率高得多。6.2 网络地图适合中小机房的资产拓扑配置网络地图的具体操作不复杂在监测 → 地图里新建地图然后添加元素——把要监控的交换机、服务器、防火墙逐个拖到画布上。每个元素可以绑定一个设备组或具体主机用标签属性来显示当前状态。关键是在元素之间的链接上绑定监控项。Zabbix地图的链接可以关联到某个触发器的状态当触发器处于问题状态时链接线的颜色会从默认变成问题色方向箭头也能标记数据流向。我之前把核心交换机到各个接入交换机的链路分别绑定了icmppingloss触发器一旦某个接入交换机丢包率超标大屏上那条线和那台设备的颜色立刻变红一眼定位故障点排查时间能缩短一半以上。需要注意地图里元素数量不宜过多超过30个维护成本就上来了。中小机房用zabbix地图足够大规模网络场景可以考虑更专业的网络拓扑工具但zabbix地图作为日常巡检的辅助完全够用。7. 真实排障复盘从监控项Not supported到定位根因7.1 案例一agent端权限导致监控项不支持先说一个我遇到的经典问题。某个客户环境里zabbix server版本是6.0agent装在Windows服务器上。我在server上添加了一个主机套用了ICMP Ping模板理论上server自己就能ping目标不需要agent参与。但过了一天去看监控项三个ICMP相关的监控项全部显示Not supported错误信息是No such file or directory。排查链路是这样的先确认server本机fping装好了且setuid权限正确手动ping目标IP也通排除了网络问题。然后在server上直接用zabbix_get -s 目标IP -k icmpping[192.168.1.1,4,50,5000,128]测试发现报错内容跟我看到的一致。查到最后发现原来zabbix的简单检查虽然不经过agent但主机的接口类型默认是agentserver会尝试通过agent通道去执行这个键值。而Windows agent本身有独立的ICMP探测实现当agent端配置不完全或者Windows防火墙阻止ICMP时就会执行失败。解决办法是在主机配置里把由agent代理列表中的agent删掉或者显式指定监控项为由server执行。再打一个补丁——Windows agent上也要安装WinPcap/Npcap驱动否则ICMP功能不可用。这个案例的教训是zabbix ICMP监控虽然不需要agent但前提是主机类型要设置正确。如果你在主机上不小心绑定了agent接口server会优先尝试agent通道去发起ICMP探测器绕了一圈反而给自己挖坑。7.2 案例二虚拟机ping不通外部网络第二个案例和热搜词里的虚拟机ping不通百度高度吻合。有个开发环境的虚拟机内部网络访问正常但ping外网IP时提示ping: www.baidu.com: Name or service not knownping IP本身能通说明DNS配置出了问题跟zabbix无直接关系。这类问题的排查顺序我建议是固定的先ping IP再ping域名。Name or service not known说明是DNS解析失败需要检查/etc/resolv.conf里的nameserver是否配置正确能不能连通DNS服务器。如果ping域名通但ping公网IP不通那就是路由或防火墙的问题需要检查默认网关、路由表和ICMP放行策略。还有一种更隐蔽的情况虚拟机里配了zabbix agent但agent的Server配置指向了一个不存在的zabbix server地址导致agent一直尝试向错误的地址连接占用CPU和网络。这时候从虚拟机ping外网IP是通的但agent在zabbix server上显示不活动。排查时可以在虚拟机上执行netstat -antp | grep zabbix看agent的连接状态再检查agent配置里的server地址是否和实际的zabbix server一致。7.3 案例三zabbix server is not running的排查链路搜热词里有一条zabbix server is not running: the information displayed may not be current.这也是ping监控部署完以后非常容易遇到的现象——本来配置得好好的打开zabbix前端页面突然看到黄条提示server没在运行然后所有监控项数据都开始卡住。造成这个问题的常见原因有几个数据库连接超出限制、server进程假死、缓存配置过小。最典型的场景是当zabbix server的数据量积累到一定规模而CacheSize配置缓存设置得太小server每秒钟要处理大量新数据但缓存不够用进程就会进入高负载状态前端探活请求久久得不到响应最终显示server is not running。排查方法分几步走。第一步在server机器上执行systemctl status zabbix-server看主进程状态如果显示active (running)但前端依然报警那多半是前端到数据库或者server内部通信出了问题。第二步看/var/log/zabbix/zabbix_server.log重点搜cannot、error、failed关键词通常能直接指向问题根因。第三步检查数据库连接数SHOW PROCESSLIST;如果看到大量由zabbix用户发起的sleep连接堆积在一起说明数据库连接没释放可以在zabbix_server.conf里把DBMaxConnections调小同时优化数据库的最大连接数。这个问题的本质是服务进程活着但处理不过来所以在监控告警里光看进程存活不够还要把zabbix server自身的zabbix[process,type,mode]指标加进监控比如zabbix server的util进程使用率、queue队列积压等才能真正掌握server的健康状态。8. 一些更高阶的玩法与我的实际心得8.1 从ping监控走向拨测监控Ping监控做的是网络层可达性探测但它有一个天然盲区目标主机ping得通不代表业务真的可用。最常见的场景是Web服务器负载过高ICMP响应正常TCP连接也正常但HTTP请求迟迟不返回。这时候你看到的ping指标全部绿色业务却已经挂了。所以成熟的做法是在ping监控基础上叠加协议层拨测。Zabbix里有net.tcp.service[http]、net.tcp.port[ip,port]这类键值可以指定探测TCP端口的连通性或者监控Web站点返回状态码。我在生产环境里的做法是一台主机同时配置ICMP ping网络层和TCP端口拨测传输层两者都正常才算健康。当某个服务挂掉但主机还活着时TCP端口拨测会先报警而不是等用户投诉了才发现。如果是互联网业务的域名拨测我建议你考虑专门的拨测工具或者自己写脚本采集因为zabbix的简单检查对复杂HTTP逻辑登录态、内容匹配支持有限。但作为基础的端口连通性监控zabbix完全够用。8.2 监控规模的取舍Ping监控虽然便宜但绝不是免费的。每台被监控主机的每次ICMP探测zabbix server都需要fork一个fping进程来执行。如果你监控几百台设备且更新间隔都设成5秒server的进程开销会非常恐怖CPU升高是小事严重时会导致server处理不过来、整个监控系统假死。我给一个规模参考值更新间隔30秒时一台4核8G的zabbix server管理300~500台主机的ICMP探测是没问题的但如果把更新间隔压到5秒撑死只建议监控100台以内。所以我建议ping监控的更新间隔保守一点内网设备30秒足够外网链路或者专线60秒也够真出了大故障30秒和5秒的差异不会影响恢复时长——你不可能因为告警早25秒就把运维反应时间缩短太多。另外还要注意监控项数量本身。zabbix的性能瓶颈往往不在数据采集而在数据库写入和前端绘图。每台主机3个ping监控项500台主机就是1500个监控项每分钟产生3000条历史数据看起来不多但如果你的历史数据保留周期设置成一两年存储量会滚雪球。建议把历史数据保留时间控制在30天以内趋势数据保留1到2年这样查询速度有保障磁盘成本也可控。8.3 最后几点建议回头看zabbix实现ping监控这件事它的核心价值不在于怎么配置三个键值而在于你想清楚监控的目标是什么、告警的边界在哪里、出了问题怎么快速定位。我的建议是从小范围试起不要一上来就给全公司几百台设备铺上ping监控。先在核心网络设备和最重要的一批服务器上跑两周观察数据形态找出正常的基线值调整好告警阈值再逐步推广。这样推广过程中如果遇到告警风暴影响面也是可控的。另外监控项命名规范一定要在建库的时候就定下来。我见过太多zabbix环境里监控项叫ICMP-1、ICMP-2这种毫无意义的名称等设备规模到几百台时根本分不清谁是谁。我的规范是ICMP-目标IP-指标比如Ping-192.168.10.1-loss、Ping-192.168.10.1-sec这样后续无论是手工排查还是写脚本导出都能一眼看明白。这套规范坚持下来后期维护会轻松很多。
返回列表