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 相关文章推荐
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
NodeJS Express框架中处理404页面一个方式
May 28 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
Nodejs实现的操作MongoDB数据库功能完整示例
Feb 02 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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输出一个等腰三角形的方法
2015/05/12 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
php实现session共享的实例方法
2019/09/19 PHP
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
jQuery性能优化的38个建议
2014/03/04 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
Python求导数的方法
2015/05/09 Python
python简单文本处理的方法
2015/07/10 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python爬虫教程知识点总结
2020/10/19 Python
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
介绍一下Linux文件的记录形式
2013/09/29 面试题
2015年试用期工作总结
2014/12/12 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL