,确认版本"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配置,你需要知道IP和端口logstash服务什么协议用于写入日志:TCP还是UDP?在我写日志到logstash之前,已经有同事写日志到logstash了。当时只知道logstash的ip和端口,没搞清楚协议,所以没写进去。logger//filename:/logs/logger.jsvarlog4js=require('log4js')//获取配置文件中logstash的IP地址和端口var{logHost,logPort}=require('../config/index.js')if(!logHost||!logPort){console.log('ERRORnotconfiglogstash_hostorlogstash_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/logstashUDPtype:'log4js-logstash-tcp',host:logHost,port:parseInt(logPort)}},categories:{default:{appenders:['logstash'],level:'debug'}}})constlogger=log4js.getLogger('default')app.js//文件名:/app.jsvarexpress=require('express')varcompression=require('压缩')varpath=require('path')varlog4js=require('log4js')varproxyMiddleware=require('http-proxy-middleware')varcookieParser=require('cookie-parser')varlogger=require('./logs/logger.js')//这引用了上面的记录器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]))})...//函数writeLog(proxyRes,req,res){varbaseLog=`${req.method}${proxyRes.statusCode}${req.cookies.email}${req.url}`varmsgObj={方法:req.method,statusCode:proxyRes.statusCode,url:req.url,email:req.cookies。电子邮件||'',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":"GET204test.cc.com/api/touch?_=1531291286527","url":"/api/touch?_=1531291286527","@timestamp":"2018-07-11T06:53:29.059Z","端口":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]}最佳实践不要在多个文件中要求一个log4js,一个应用应该共享一个log4js,否则可能会导致log写入logstash失败(我遇到过这个问题,纠结了好久。)如下图,其他日志写入只需要引用这个文件即可。//文件名:logstash.jsvarlog4js=require('log4js')var{logstash}=require('../config/default.js')varhost=logstash.split(':')[0]varport=parseInt(logstash.split(':')[1])log4js.configure({appenders:{console:{type:'console'},logstash:{type:'log4js-logstash-tcp',host,port,fields:{instanceId:process.env.HOSTNAME||'appName',appName:'appName'}}},类别:{default:{appenders:['logstash','console'],level:'debug'}}})module.exports=log4js.getLogger('default')constlog=require('./logstash.js')router.get('/api',(req,res,next)=>{log.info('messagecoming')})注意写日志是使用UDP还是TCP如果要使用,Logstash(UDP和HTTP)appender,这个功能已经移到https://github.com/log4js-nod...最好单独安装
