利用redis將log4js產生的日誌送到logstash

log4js-logstash-redis

在用Node.js開發項目的時候,咱們經常使用 log4js 模塊來進行日誌的記錄,能夠經過配置 log4js 的 Appenders 將日誌輸出到Console、File和GELF等不一樣的地方。javascript

logstash

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

logstashUDP

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

原文地址:利用redis將log4js產生的日誌送到logstash

相關文章
相關標籤/搜索