在用Node.js開發項目的時候,咱們經常使用 log4js 模塊來進行日誌的記錄,能夠經過配置 log4js 的 Appenders 將日誌輸出到Console、File和GELF等不一樣的地方。javascript
logstash 是 elastic 技術棧的其中一員,常被用來收集和解析日誌。一種比較常見的作法就是在項目工程中把日誌寫入到日誌文件中,而後用 logstash 讀取和解析日誌文件。好比在 Node.js 項目中,若要將日誌記錄到文件中,只需對 log4js 作以下配置便可:java
const log4js = require('log4js'); log4js.configure({ appenders: [{ type: 'file', filename: './example.log' }] }); const logger = log4js.getLogger(); logger.info('hello');
這樣日誌就會被記錄到 example.log
文件中,而後再對 logstash 的 input 作以下配置:node
file { path => "YourLogPath/example.log" start_position => "beginning" } }
這樣 logstash 就能夠讀取這個日誌文件。但是這樣總感受用一個文件做爲中轉略顯麻煩,若是能將 log4js 產生的日誌直接送到 logstash 就更好了。git
log4js 內置了 logstashUDP 來直接將日誌輸出到 logstash。配置以下:github
log4js.configure({ appenders: [{ type: "logstashUDP", host: "localhost", port: 12345 }] });
而後將 logstash 的配置改爲下面這樣:redis
input { udp { host => "127.0.0.1" port => 12345 } }
嗯,很簡單嘛!如今 log4js 產生的日誌就能直接送到 logstash 了,而再也不須要用一個文件做爲中轉。可是,當我在使用的時候發現一個問題,就是若是 logstash 服務掛了,這時候 log4js 仍然在不斷的產生日誌數據,這時候首先想到的就是把 logstash 從新啓動起來,但重啓後卻發現 logstash 沒能獲取到在 logstash 掛掉的時候 log4js 產生的數據,也就是說若是 logstash 掛掉了的話,那麼 log4js 產生的數據就會丟失,不會被處理。
這時候就想着用一個代理來暫存 log4js 產生的數據,log4js 將數據輸出到代理,logstash 從代理那裏讀取數據,logstash 讀取一條數據,代理就丟棄掉那條數據。對,也就是隊列。這樣就不會有數據丟失的問題了。npm
log4js-logstash-redis 就是爲了解決上述問題而開發的一個 log4js 的 Appender。
他的原理是:log4js 將產生的日誌輸出到 redis,而後讓 logstash 從 redis 讀取數據。可是直接叫 log4js-redis 就行了嘛,爲何叫 log4js-logstash-redis 呢?這是由於將日誌格式針對 logstash 作過一些更友好的定製。?json
npm install log4js-logstash-redis --save
log4js.configure({ appenders: [{ type: "log4js-logstash-redis", key: "test", redis: { db: 1 } }] });
redis 配置可選,沒有的話 redis 鏈接就採用默認值。logstash 的配置以下:app
redis { data_type => "list" key => "test" codec => json }
其中 data_type 的值必定要是 list。ui