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服务器(6):作出响应
Dec 18 NodeJs
Nodejs初级阶段之express
Nov 23 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 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学习之数组的定义和填充
2011/04/17 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
python随机生成指定长度密码的方法
2015/04/04 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
python将图片转base64,实现前端显示
2020/01/09 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
怎么写有吸引力的自荐信
2013/11/17 职场文书
安全教育心得体会
2013/12/29 职场文书
社区志愿者心得体会
2014/01/03 职场文书
毕业证丢失证明
2014/01/15 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
毕业生见习报告总结
2014/11/08 职场文书
2014年采购工作总结
2014/11/20 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
大班上学期个人总结
2015/02/13 职场文书
2015年社区党务工作总结
2015/04/21 职场文书