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之请求路由概述
Jul 05 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
详解nodejs内置模块
May 06 NodeJs
node快速搭建后台的实现步骤
Feb 18 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 模拟POST|GET操作实现代码
2010/07/20 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
js 居中漂浮广告
2010/03/21 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
Python Mysql自动备份脚本
2008/07/14 Python
Python 除法小技巧
2008/09/06 Python
用Python制作简单的钢琴程序的教程
2015/04/01 Python
python去除文件中重复的行实例
2018/06/29 Python
python3.6数独问题的解决
2019/01/21 Python
python制作图片缩略图
2019/04/30 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
Python如何输出百分比
2020/07/31 Python
Python configparser模块应用过程解析
2020/08/14 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
爱情寄语大全
2014/04/09 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书