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