Nodejs Express 通过log4js写日志到Logstash(ELK)


Posted in NodeJs onAugust 30, 2018

Log4j 是一个使用 Java 语言编写的,可靠、快速、灵活的日志框架(API),使用 Apache Software License 授权。它被移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 语言中。

Log4j 是高度可配置的,在运行期使用外部的配置文件对其进行配置。它按照优先级别记录日志,并可将日志信息定向输出到各种介质,比如数据库、文件、控制台、Unix Syslog等。

Log4j 主要由三部分组成:

  • loggers:负责采集日志信息。
  • appenders:负责将日志信息发布到不同地方。
  • layouts:负责以各种风格格式化日志信息。

确认版本

"dependencies": {
  "body-parser": "1.18.3",
  "compression": "1.7.2",
  "cookie-parser": "1.4.3",
  "ejs": "2.6.1",
  "express": "4.16.3",
  "forever": "0.15.3",
  "http-proxy-middleware": "0.18.0",
  "log4js": "2.9.0",
  "log4js-logstash-tcp": "1.0.1",
  "serve-favicon": "2.5.0"
 },

Logstash配置

  • 你需要知道logstash服务的IP和端口
  • 你需要知道写日志是通过什么协议:TCP,还是UDP

在我向logstash写日志之前,已经有同事向Logstash写过日志了。当时只是知道logstash的ip和端口,没有搞清楚协议,所以没有写进去。

logger

// filename: /logs/logger.js

var log4js = require('log4js')

// 获取配置文件中logstash的IP地址和端口
var {logHost, logPort} = require('../config/index.js') 

if (!logHost || !logPort) {
 console.log('ERROR not config logstash_host or logstash_port')
}

log4js.configure({
 appenders: {
  console: { type: 'console' },
  logstash: {
   // 因为我们的logstash暴露的是tcp写日志的端口,所以我用了log4js-logstash-tcp,
   // 这个需要安装 https://github.com/Aigent/log4js-logstash-tcp
   // 如果你的logstash使用UDP的,参考 https://github.com/log4js-node/logstashUDP
   type: 'log4js-logstash-tcp', 
   host: logHost,
   port: parseInt(logPort)
  }
 },
 categories: {
  default: { appenders: ['logstash'], level: 'debug' }
 }
})

const logger = log4js.getLogger('default')

app.js

// filename: /app.js
var express = require('express')
var compression = require('compression')
var path = require('path')
var log4js = require('log4js')
var proxyMiddleware = require('http-proxy-middleware')
var cookieParser = require('cookie-parser')

var logger = require('./logs/logger.js') // 这了引用了上面的logger
var {proxyTable, maxAge} = require('./config/index.js')

...
Object.keys(proxyTable).forEach(function (context) {
 if (!proxyTable[context].ws) {
  // 这里我是用的反向代理,当代理响应时,开始写日志
  proxyTable[context].onProxyRes = writeLog
 }
 app.use(proxyMiddleware(context, proxyTable[context]))
})
...

// 主要谢日日志的就是这里
function writeLog (proxyRes, req, res) {
 var baseLog = `${req.method} ${proxyRes.statusCode} ${req.cookies.email} ${req.url}`
 var msgObj = {
  method: req.method,
  statusCode: proxyRes.statusCode,
  url: req.url,
  email: req.cookies.email || '',
  sessionId: req.cookies.sessionId || '',
  instanceId: 'newTm',
  nodeName: 'newTm'
 }

 if (proxyRes.statusCode < 400) {
  logger.info(baseLog, msgObj)
 } else {
  logger.error(baseLog, msgObj)
 }
}

在kibana中输入关键词:nodeName:newTm

可以搜到如下的记录

{
 "_index": "logstash-2018.07.11",
 "_type": "logs",
 "_id": "AWSIGyY0vR6RLdfU8xZj",
 "_score": null,
 "_source": {
  "nodeName": "newTm",
  "method": "GET",
  "level": "INFO",
  "sessionId": "",
  "message": "GET 204 test.cc.com /api/touch?_=1531291286527",
  "url": "/api/touch?_=1531291286527",
  "@timestamp": "2018-07-11T06:53:29.059Z",
  "port": 57250,
  "@version": "1",
  "host": "192.168.2.74",
  "fields": {
   "nodeName": "newTm",
   "method": "GET",
   "level": "INFO",
   "sessionId": "",
   "category": "default",
   "url": "/api/touch?_=1531291286527",
   "email": "test.cc.com",
   "statusCode": 204
  },
  "category": "default",
  "email": "test.cc.com",
  "statusCode": 204
 },
 "fields": {
  "@timestamp": [
   1531292009059
  ]
 },
 "highlight": {
  "nodeName": [
   "@kibana-highlighted-field@newTm@/kibana-highlighted-field@"
  ]
 },
 "sort": [
  1531292009059
 ]
}

注意

  • 要注意写日志是用UDP还是TCP
  • 如果要用,Logstash (UDP and HTTP) appender,该功能已经被移动到 https://github.com/log4js-node/logstashUDP 最好要单独安装

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
nodejs文件夹深层复制功能
Sep 03 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 #NodeJs
Nodejs中的JWT和Session的使用
Aug 21 #NodeJs
nodejs 如何手动实现服务器
Aug 20 #NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 #NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 #NodeJs
nodejs之koa2请求示例(GET,POST)
Aug 07 #NodeJs
NodeJS实现自定义流的方法
Aug 01 #NodeJs
You might like
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
php创建多级目录的方法
2015/03/24 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
php实现的生成排列算法示例
2019/07/25 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
几种响应式文字详解
2017/05/19 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
python2和python3哪个使用率高
2020/06/23 Python
Python字符串三种格式化输出
2020/09/17 Python
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
什么样的创业计划书可行性高?
2014/02/01 职场文书
食品安全标语
2014/06/07 职场文书
酒店员工管理制度
2015/08/05 职场文书
严以用权学习心得体会
2016/01/12 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS