日志透传工具-channel
摘要: 作者介绍了基于管道和TCP实现的日志透传工具channel,旨在解决嵌入式系统长时间采集全量日志时内存和性能瓶颈的问题。该工具支持本地和远程数据传输,通过TCP保证数据完整性,适用于将嵌入式系统的日志实时传输到主机或多工程师共享。实现原理主要依赖管道读取和TCP传输,设计简洁,适合ASCII字符的日志数据。作者最初为性能分析采集雷达系统top
命令输出,后考虑自动化和安全性,专注于无授权字符透传,放弃文件透传功能。项目已支持C++17,提供编译和交叉编译方式。 (评价: A)
在一些嵌入式系统中,如果需要采集长时间的全量日志或者系统性能数据,内存将成为一个瓶颈。是否可以将嵌入式系统中的数据透传到外部机器上,这样内存和性能都没有限制。通过此想法实现了channel这个工具,主要作用就是消息透传。
项目地址:https://github.com/caibingcheng/channel.git
使用
本地使用
最基本的使用方法,在服务端运行:
|
|
那么同一ip下的客户端将接收到:
|
|
透传日志
如果是将嵌入式系统中的信息传递到本地主机,那么在嵌入式系统中:
|
|
本地主机可以得到:
|
|
分享实时日志
引申出的一个应用场景是可以与其他工程师共同分析日志,比如在你的机器上:
|
|
在其他工程师机器上就可以实时获取你分享的内容:
|
|
安装
该项目使用了一些C++17特性,因此需要至少支持C++17的GCC。
|
|
或者交叉编译为arm版本:
|
|
原理
实现该工具的基本想法就是管道 + TCP。
通过管道可以实现下面这样的用法,不会破坏原有程序运行的结构。
|
|
使用TCP则是考虑透传数据完整性是第一保证,其次是性能。
Linux中的管道可以将前一个输出变为下一个的输入。在channel中使用该特性的代码为:
|
|
目前实现相当于直接从std::cin
中读取内容,可能存在一些兼容性问题。不过实现channel是考虑的主要应用场景就是日志透传,基本都是ASCII字符,因此一般也不会出现兼容性问题。
小结
这个工具的基本想法是很朴素的。最开始的来源是,我做了一个性能统计和分析的工具,需要采集雷达系统上的top
命令的输出,有些场景可能需要采集几十个小时,这时候数据放雷达中是不显示的,内存受限。因此可以通过sshpass + ssh
工具的组合,在本地机器上采集。但是这样需要密码认证,自动化脚本时则需要明文密码,不太适合,因此才考虑了直接通过无授权的日志透传,来将雷达中的信息传递到本地电脑上。
开始实现的版本中,我考虑了“既然实现了字符的透传,不如实现一下文件透传”,而后还是删除了文件透传的功能,文件透传必要性不高,而且一般都是用scp、rsync
工具,对其使用方法已经比较熟悉了。而字符透传的工具比较少,通过ssh协议似乎也可行,但我不太熟悉,且需要用户密码,不适合和其他同事的电脑分享。因此索性专一channel的功能,只做日志透传,不需要授权认证。