Web实时日志输出查看管理系统
开发人员无权限访问生产服务器,怎样查看日志来分析问题?
安全管理合规的原因,开发未被授权访问生产服务器,但经常会有分析问题查看日志的需求. 大家一般是怎样解决的?
我尝试用过的,或者是想到的方法主要有如下几种,但都不太完美,有更好的方案或者工具吗?
- 开源产品 logio http://logio.org/ 可实时采集日志通过 web 展示 , 应用多了,日志多了分类浏览不便,无法解决持久存储的问题
- fluented 同步日志文本,以文本模式存储在专用的日志服务器.
- 系统管理员手工复制日志
- jenkins + ansible+shell 脚本 复制传输日志
- 使用ELK 处理过多行文本,比如 tomcat 的日志
- 利用linux服务器系统自带的rsyslog+php进行日志采集
- 搭建FTP映射虚拟目录指向日志目录(前提只开读权限)
- 考虑 log 实时上传到云上或者同步到一台专门的日志服务器上
今天我们要介绍一款实时同步分析日志的web管理工具Log.io 让我们一起感受一哈Websocket的魅力。
Node.js中使用Log.io在浏览器中实时监控日志,Log.io等同于tail -f命令,但更强大(web+node展示)
官方介绍:http://logio.org/
GitHub源码:https://github.com/NarrativeScience/Log.io
日志是个好东西,对技术人员来说写日志能纪录成长,分享经验;对机器来说纪录日志能及时发现错误,为日后的排错提供信息。如果还在一台机器上用 tail -f 监听单个日志或者用 multitail 监听多个日志也太 out 了,我们需要一种工具能纪录上百台机器、不同类型的日志,并最好能汇集到一个界面里方便查看,最好还是实时的。
log.io 是一个实时日志监控工具,采用 node.js + socket.io 开发,使用浏览器访问,每秒可以处理超过5000条日志变动消息。有一点要指出来的是 log.io 只监视日志变动并不存储日志,和其他的监控工具一样,log.io 也采用服务器-客户端的模式。
log.io 由两部分组成:server 和 harvester
server 运行在机器 A(服务器)上监视和纪录其他机器发来的日志消息;
log harvester 运行在机器 B(客户端)上用来监听和收集机器 B 上的日志改动,并将改动发送给机器 A,每个需要纪录日志的机器都需要一个 harvester.
在A和B两台机器上同时安装(第一步到第四步)
一、安装依赖包
yum install gcc gcc-c++ openssl-devel pkgconfig -y
二、下载 node.js 源代码,编译并安装:
wget http://nodejs.org/dist/v0.8.14/node-v0.8.14.tar.gz tar xf node-v0.8.14/ ./configure make make install
三、安装NPM
wget https://npmjs.org/install.sh && sh install.shsi
四、安装 log.io(包含了 log server 和 log harvester)
npm config set unsafe-perm true
npm install -g --prefix=/usr/local log.io
注意:第二部安装的时候安装时间较长(基于网络下载软件包),请耐心等待!!
五、在服务端(A节点)上启动server
cd node-v0.8.14 log.io-server start
六、在客户端(B节点)配置
vim /root/.log.io/harvester.conf exports.config = { nodeName: "nodeB", ####修改节点名称(自定义) logStreams: { nginx_access: [ ####日志服务的名称(自定义) "/var/log/nginx/access.log", ###日记存储路径 ], nginx_error: [ ####日志服务的名称(自定义) "/var/log/nginx/error.log" ###日记存储路径 ] }, server: { host: '10.10.0.2', ####log.io Server端的IP port: 28777 ####log.io Server端的端口(默认端口) } }
七、在客户端(B节点)启动服务
cd node-v0.8.14 log.io-harvester start
八、通过游览器查看日记实时信息
附录Windows部署请参考:https://www.cnblogs.com/loveclumsybaby/p/10622974.html
Log.IO能做什么
这个软件的功能非常简单,对的,非常简单!不像Zabbix一样具备非常多的隐藏技能,安装过程非常简单.
npm install -g log.io --user "root"
//启动server
log.io-server
//修改一下配置,主要改服务器信息和日志路径
vi ~/.log.io/harvester.conf
//启动采集器
log.io-harvester
//访问页面
http://localhost:28778
Paste_Image.png
他就提供了一个看实时日志的界面(原谅我突然就开启了吐槽模式,你这会不会也太简单了一点),不过总的来说,问题还是能解决的,左侧的菜单思路是节点->应用名这样的模式,这个倒是挺正派的,一个节点底下会有多份不同的日志(话说作者不知道有没考虑过给节点分个组呢),右侧的就是应用了,勾选的日志信息都会在这里展现出来,其实单服务器的话倒是没什么问题,但是多服务器,刷日志又刷的快的情况下,这个界面就会看的眼花缭乱了。
Log.IO源码分析
站在巨人的肩膀上(有现成的就拿来抄)的思想是我一直所坚持的(这才是生产力啊!ヽ( ∀)ノ),先看整体架构,直接上官方架构图
Paste_Image.png
做法是通过Harvester进行日志采集,通过TCP送到Server,然后Server通过WebSocket送到web页面上面。
Harvester的运转方式
- 记录指定日志文件的Current Position,然后监控日志文件的变化(NodeJS本身就挺多这样的库的),每当发生Change事件之后,往下读文件
- 把变更的文件通过一定的格式采用TCP协议送到Server端
+log|web_server|my_server01|info|this is log messages
Server的运作方式
Server在接受到Harvester送来的的信息之后,把字符串变成LogObject、LogStream、LogNode等一系列对象
通过Socket.IO这个库把日志信息往外送,Socket.IO这个库倒是挺简单易用的,上个官网例子
var io = require('socket.io')(80);
var cfg = require('./config.json');
var tw = require('node-tweet-stream')(cfg);
tw.track('socket.io');
tw.track('javascript');
tw.on('tweet', function(tweet){
io.emit('tweet', tweet);
});
Web
Web的开发上倒是挺中规中矩的,采用比较流行的Express,然后通过WebSocket接收完数据之后就把对应的数据显示在页面上
一些想法
Log.IO这个应用代码量非常的少,这种易读性使得这个程序非常适合拿来改造(比起读Kibana那界面的原源码,这简直就是天堂T_T),所以,不由的就产生了一些想法
对Harvester的一些想法
按照Harvester的运作方式来看,我认为完全可以不采用log.io的Harvester,而直接采用类似Rsyslog这样的大多数操作系统上都存在的日志收集工具就可以了,免去Agent部署升级的烦恼。不然还不知道会不会碰上Agent性能不稳定搞挂服务器呢
对Server的一些想法
既然是WebSocket,那么是不是可以采用类似在Nginx上加WebSocket扩展之类的做法来把Server替换掉呢?
log.io是不是能够集成到ELK这类日志搜索软件里面,作为辅助功能存在呢?日志先送到ES或者是一些其他地方,然后再通过一些Transfer程序把日志送到Server
对Web的一些想法
Web这种操作上的东西,应各业务场景(个人品味。。。)不同会有比较大的差别,假如是我设计这个功能的原型,我会希望页面上能有这样的功能。
- 实时日志按照时间分屏展示;
- 能够在界面上输入关键字,然后对关键字日志高亮,方便排查问题;
- 再多一个业务模块的分组,方便对整组业务模块的服务器进行过滤;
- 根据提供的关键字信息,只展示具备关键字的日志行(类似tail -f xxx|grep 这样的功能);
用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息
一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看。你还在用ajax每隔段时间去获取服务器日志?out了,试试用websocket方式吧。
【参考文档】
1、Log.IO的使用场景和改造思路 - 简书 https://www.jianshu.com/p/c301cae2f394
2、运维开发:python websocket网页实时显示远程服务器日志信息 - https://www.cnblogs.com/php-rearch/p/6661241.html
3、如何把Tomcat的日志实时输出到Web页面上_https://www.linuxidc.com/Linux/2015-02/113356.htm
4、网页中实时查看服务器日志(websocket + node.js实现) https://blog.****.net/definite_things/article/details/43058919
5、Java用WebSocket + tail命令实现Web实时日志 -https://blog.****.net/xiao__gui/article/details/50041673
6、个人开发者的服务器日志收集 - https://soulteary.com/2018/06/13/server-log-collection-for-individual-developers.html
7、日志服务器应用开发 - vitaair的博客 - ****博客 https://blog.****.net/vitaair/article/details/80220619
8、网站用户行为日志采集和后台日志服务器搭建 - https://blog.****.net/weixin_37490221/article/details/80894827
9、windows下,Kiwi_Syslog日志服务器的搭建 - https://blog.****.net/McYaoYao/article/details/78225466
10、远哥谈 使用WebSocket开发在线实时看远程服务器log日志的工具 - https://www.cnblogs.com/taven/p/3483002.html