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 npm包管理的配置方法及常用命令介绍
Jun 05 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 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
拼音码表的生成
2006/10/09 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python time模块用法实例详解
2014/09/11 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
python操作oracle的完整教程分享
2018/01/30 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
python实现简单井字棋游戏
2020/03/04 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
Django URL参数Template反向解析
2020/11/24 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
物流管理系毕业生求职信
2014/06/03 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python