Web實時日誌輸出檢視管理系統

天府雲創發表於2019-04-03

開發人員無許可權訪問生產伺服器,怎樣檢視日誌來分析問題?

安全管理合規的原因,開發未被授權訪問生產伺服器,但經常會有分析問題檢視日誌的需求. 大家一般是怎樣解決的?

我嘗試用過的,或者是想到的方法主要有如下幾種,但都不太完美,有更好的方案或者工具嗎?

  • 開源產品 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

 

相關文章