开发人员无权限访问生产服务器,怎样查看日志来分析问题?

安全管理合规的原因,开发未被授权访问生产服务器,但经常会有分析问题查看日志的需求. 大家一般是怎样解决的?

我尝试用过的,或者是想到的方法主要有如下几种,但都不太完美,有更好的方案或者工具吗?

  • 开源产品 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.csdn.net/definite_things/article/details/43058919

5、Java用WebSocket + tail命令实现Web实时日志 -https://blog.csdn.net/xiao__gui/article/details/50041673

6、个人开发者的服务器日志收集 - https://soulteary.com/2018/06/13/server-log-collection-for-individual-developers.html

7、日志服务器应用开发 - vitaair的博客 - CSDN博客 https://blog.csdn.net/vitaair/article/details/80220619

8、网站用户行为日志采集和后台日志服务器搭建 - https://blog.csdn.net/weixin_37490221/article/details/80894827

9、windows下,Kiwi_Syslog日志服务器的搭建 - https://blog.csdn.net/McYaoYao/article/details/78225466

10、远哥谈 使用WebSocket开发在线实时看远程服务器log日志的工具 - https://www.cnblogs.com/taven/p/3483002.html

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐