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 Express框架中处理404页面一个方式
May 28 NodeJs
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
YB217、YB235、YB400浅听
2021/03/02 无线电
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
RequireJs的使用详解
2017/02/19 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
Python迭代用法实例教程
2014/09/08 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python算法应用实战之队列详解
2017/02/04 Python
Python有序字典简单实现方法示例
2017/09/28 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
django中间键重定向实例方法
2019/11/10 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
keras导入weights方式
2020/06/12 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
北京SQL新华信咨询
2016/09/30 面试题
后勤副校长自我鉴定
2013/10/13 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
网络妈妈观后感
2015/06/08 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书