在用Node.js开发项目的时候,我们常用 log4js 模块来进行日志的记录,可以通过配置 log4js 的 Appenders 将日志输出到Console、File和GELF等不同的地方。

logstash

logstash 是 elastic 技术栈的其中一员,常被用来收集和解析日志。一种比较常见的做法就是在项目工程中把日志写入到日志文件中,然后用 logstash 读取和解析日志文件。比如在 Node.js 项目中,若要将日志记录到文件中,只需对 log4js 做如下配置即可:

const log4js = require('log4js');
log4js.configure({
appenders: [{
type: 'file',
filename: './example.log'
}]
}); const logger = log4js.getLogger();
logger.info('hello');

这样日志就会被记录到 example.log 文件中,然后再对 logstash 的 input 做如下配置:

file {
path => "YourLogPath/example.log"
start_position => "beginning"
}
}

这样 logstash 就可以读取这个日志文件。可是这样总感觉用一个文件作为中转略显麻烦,如果能将 log4js 产生的日志直接送到 logstash 就更好了。

logstashUDP

log4js 内置了 logstashUDP 来直接将日志输出到 logstash。配置如下:

log4js.configure({
appenders: [{
type: "logstashUDP",
host: "localhost",
port: 12345
}]
});

然后将 logstash 的配置改成下面这样:

input {
udp {
host => "127.0.0.1"
port => 12345
}
}

嗯,很简单嘛!现在 log4js 产生的日志就能直接送到 logstash 了,而不再需要用一个文件作为中转。但是,当我在使用的时候发现一个问题,就是如果 logstash 服务挂了,这时候 log4js 仍然在不断的产生日志数据,这时候首先想到的就是把 logstash 重新启动起来,但重启后却发现 logstash 没能获取到在 logstash 挂掉的时候 log4js 产生的数据,也就是说如果 logstash 挂掉了的话,那么 log4js 产生的数据就会丢失,不会被处理。
这时候就想着用一个代理来暂存 log4js 产生的数据,log4js 将数据输出到代理,logstash 从代理那里读取数据,logstash 读取一条数据,代理就丢弃掉那条数据。对,也就是队列。这样就不会有数据丢失的问题了。

log4js-logstash-redis

log4js-logstash-redis 就是为了解决上述问题而开发的一个 log4js 的 Appender。
他的原理是:log4js 将产生的日志输出到 redis,然后让 logstash 从 redis 读取数据。但是直接叫 log4js-redis 就好了嘛,为什么叫 log4js-logstash-redis 呢?这是因为将日志格式针对 logstash 做过一些更友好的定制。?

安装

npm install log4js-logstash-redis --save

使用

log4js.configure({
appenders: [{
type: "log4js-logstash-redis",
key: "test",
redis: {
db: 1
}
}]
});

redis 配置可选,没有的话 redis 连接就采用默认值。logstash 的配置如下:

redis {
data_type => "list"
key => "test"
codec => json
}

其中 data_type 的值一定要是 list。

原文地址:利用redis将log4js产生的日志送到logstash

logstash可以考虑在项目中用起来的更多相关文章

  1. 项目中用到RouteTable,发布到IIS7中无法访问

    项目中用到RouteTable,发布到IIS7中,访问之后没有任何反应,google半天终于找到了解决方法,就是要把iis的“HTTP重定向”功能打开

  2. iOS 项目中用到的一些开源库和第三方组件

    iOS 项目中用到的一些 iOS 开源库和第三方组件 分享一下我目前所在公司 iOS 项目中用到的一些 iOS 开源库和第三方组件, 感谢开源, 减少了我们的劳动力, 节约了我们大量的时间, 让我们有 ...

  3. iOS:项目中用到的Cookie

    1.介绍: 做了这么长时间开发,Cookie真是用的不多,可是现在不一样了,这次的项目我用到了Cookie.其实,Cookie的使用在项目中愈加的频繁,一般情况下,提供的接口是用Cookie来识别用户 ...

  4. 项目中用到的SQL-总结

    基本sql总结: Group by的理解:having子句,分组函数 Group by使用的限定: 1.出现在Select列表中的字段或者出现在order by后面的字段,如果不是包含在分组函数中,那 ...

  5. LinkedHashMap和HashMap的比较使用 由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下。 ? import java.util.HashMap; impo

    LinkedHashMap和HashMap的比较使用 由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下. import java.util.HashMap; import ...

  6. 项目中用到的input 遇到的问题的归类

    input 前几天 为了这个词 用在搜索框被我们总监喷,为了加强印象,我把它记录下来 最原始的造型 <input type="text" value="搜索&quo ...

  7. 在项目中用过Spring的哪些方面?及用过哪些Ajax框架?

    在项目中用过Spring的哪些方面?及用过哪些Ajax框架? 解答:在项目使用过Spring IOC ,AOP,DAO,ORM,还有上下文环境. 在项目使用过Ext,Juery等Ajax框架.

  8. 我在一个前端项目中用js整理的一些通用方法,其中使用到的思想,主要就是约定了。

    把名称和后台来的json数据约定起来,可以达到的效果就是可以将东西统一化,减少差异,提升模块等的通用性,此后就可以实现具体不同模块内容可以自动或拷贝赋值的方式 2016.7.18 refactor s ...

  9. linux下查看动态链接库依赖关系的命令 x86: ldd *.so arm: arm-linux-readelf -d *.so 实际例子: 以项目中用到的库librtsp.so分析: lijun@ubuntu:~/workspace$ arm-hisiv100nptl-linux-ld -d librtsp.so arm-hisiv100nptl-linux-ld:

    linux下查看动态链接库依赖关系的命令 x86:ldd    *.so arm:arm-linux-readelf    -d    *.so 实际例子:以项目中用到的库librtsp.so分析:l ...

随机推荐

  1. 解决Adobe cs6系列软件在Windows10操作系统中无法正常运行问题

    大家好,我是安德风,很高兴今天能给大家一起解决Adobe cs6系列软件在Windows10操作系统中无法正常运行的问题.今天我以Adobe Photoshop cs6在Windows10环境安装运行 ...

  2. pod 常用指令

    //只安装新增的库,已经安装的库不更新 pod install --verbose --no-repo-update //只更新指定库名的第三个库,其他库不更新 pod update 库名 --ver ...

  3. python signal模块

    signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等.要注意,signal包主要是针对UNIX平台(比如Linux, MAC ...

  4. PMP备考笔记--1.1

    题型 200道中英文单选题 基本概念题(%10) 过程工具/技术和输入输出题ITTO (%10) 情景题(%70) 计算题(3-5道题) 图 pmp四大挑战 试卷100页,题干长,阅读量大,考试4个小 ...

  5. Python标准库: functools (cmp_to_key, lru_cache, total_ordering, partial, partialmethod, reduce, singledispatch, update_wrapper, wraps)

    functools模块处理的对象都是其他的函数,任何可调用对象都可以被视为用于此模块的函数. 1. functools.cmp_to_key(func) 因为Python3不支持比较函数,cmp_to ...

  6. 通过noVNC和websockify连接到QEMU/KVM 转

    开源项目 QEMU.KVM.libvirt 实现了创建虚拟机,启动虚拟机,监控虚拟机.我们解决了从无到有的问题,这时就该考虑从有到优了.尽管我们能使用 SSH 的方式来登录使用虚拟机,但这种方式从感觉 ...

  7. linux定时任务每隔5分钟向文本追加一行

    编写shell脚本 test.sh内容如下,上传到linux的root目录 更改文件权限 chmod  777   test.sh 编辑定时任务 crontab  -e */5    *  *  *  ...

  8. 欧拉图Eulerian Graph

    一.节点的度 无向图:节点的度为该节点所连接的边数 有向图:节点的度分为入度和出度. 二.欧拉图定义 具有欧拉回路的图称作欧拉图,具有欧拉路径而无欧拉回路的图称为半欧拉图. 欧拉回路: ​ 通过图中每 ...

  9. Win自带mastc远程Cenots7桌面

    1.Centos7安装桌面 yum -y groups install "GNOME Desktop" startx 2.安装xrdp 操作需要root用户权限,所以,我们先切换为 ...

  10. Spring Cloud Alibaba学习笔记(8) - RocketMQ术语与概念

    Topic 一类消息的集合,RocketMQ的基本订阅单位 部署结构 Name Server Name Server 为 producer 和 consumer 提供路由信息. 相对来说,namese ...