任务背景:
一个应用程序运行的时候,可能需要查看多个模块的状态,如gps是否锁定,eeprom是否读写正常等。通常我们是通过过滤log的方式进行查看。看到有的公司提供了界面化的工具,显示当前进程执行了哪些步骤,以及哪些步骤未执行。因此想仿写一个简化版。
实际工作中,遇到了多板卡开发的情况,每个板卡都有一个终端,查看模块状态非常麻烦。以小区建站、时钟同步为例,经常需要在不同的板卡开log,grep 关键字。如果监控的模块多了,简直就是反人类了。。。
预计方案:
1,每个板卡加一个log收集进程,持续查看各板卡的log文件,并将结果发送到网络。在某一板卡或者电脑上接收并展示。(每个板卡需要一个独立发送进程,需要接收端)
2,修改原有的log收集逻辑,在保存本地的同时,发送到网络。在某一板卡或者电脑上接收并展示。(需要改动zlog配置文件,不确定能不能行,需要接收端)
3,在电脑或者某一板卡上,通过sshpass + tail 收集其它板卡的log,然后统一显示。
最终方案:(使用预计方案3)
BBU/zpp 收集所有板卡的信息,并统一显示。(不用主控的原因是,在主控上对BBU用ssppass会失败,同时最终成品,zk没有对外接口)
1,新增shell脚本,用于收集信息,定时刷新,颜色区分显示。
2,新增cfg文件,用于配置有几个板卡,显示多少条SHOW_NAME。每条SHOW_NAME变色的条件是?并打印信息。
3,创建tmp目录,分等目录,然后tail -F收集log并写入。这里面要有断线重连功能。
配置文件说明:
没有收到消息时,展示所有的SHOW_NAME,并且都是灰码展示。
如果收到 MQTT 消息,则文字产生变化。
如果收到 LOG_OK 消息,则SHOW_NAME发生变化。例如变绿
如果收到 LOG_ERR 消息,则SHOW_NAME发生变化。例如变红
每5S刷新一次。
1, 先解析配置文件,确认哪些东西需要展示,并顺序显示初始状态。
1.1 while循环,从配置文件中顺序把需要展示的数据弄出来,在shell中存储。这部分的目的是过滤注释。
1.2 创建string buffer: str_type[] , str_name[] , str_msg[] , show_flag[] , show_buf[]
str_type的作用是存储配置文件中的SHOW_TYPE
str_name的作用是存储配置文件中的SHOW_NAME
str_msg的作用是存储配置文件中的SHOW_MSG
show_flag的作用是判断是否收到相应的log或者MQTT
show_buf的作用是存储将要输出到终端的字符串
2, 收集需要的log消息,准备进行处理。
2.1 开启新线程,收集log消息,并保存在本地。 bbu_log,fh_log,zk_log,zpp_log,
这里有个问题啊,tail -F收集log的时候不能中断。如果log太多,是不是要做ring_buffer?
2.2 过滤log,与str_msg进行比对,根据比对结果更新show_flag。(5S循环一次)
3, 处理完log消息后,更新显示的状态。
3.1 while循环后,每5S刷新一次显示,输出show_buf ,每个小字符串80字符长度。。
由于shell对二维数组的支持较差,所以选择用给一个大数组来弄。然后取出每个block的范围。
由于不能用二维数组,eval在有的板卡上不能使用,导致用起来不是很顺手。
4,get log的问题。
log可能会很大,为了不占用太大的存储资源,因此使用循环buffer的方法。放弃了,循环buf收益比想象中小。主要是发现空间足够,爽。
具体实现: