開發人員無權限訪問生產服務器,怎樣查看日誌來分析問題?
安全管理合規的原因,開發未被授權訪問生產服務器,但經常會有分析問題查看日誌的需求. 大家一般是怎樣解決的?
我嘗試用過的,或者是想到的方法主要有如下幾種,但都不太完美,有更好的方案或者工具嗎?
- 開源產品 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