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中SSL服务的性能
Jul 15 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
nodejs中的异步编程知识点详解
Jan 17 NodeJs
Nodejs 数组的队列以及forEach的应用详解
Feb 25 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
apache rewrite_module模块使用教程
2008/01/10 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
node.js require() 源码解读
2015/12/13 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
老生常谈js数据类型
2017/08/03 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
python解析xml文件实例分享
2013/12/04 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
python 类之间的参数传递方式
2019/12/20 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
翻译专业应届生求职信
2013/11/23 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
银行自荐信范文
2015/03/25 职场文书
辞职信格式范文
2015/05/13 职场文书
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android
JS实现简单的九宫格抽奖
2022/06/28 Javascript
Windows server 2016服务器基本设置
2022/08/14 Servers