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.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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章