Nodejs Express 는 log4js 를 통 해 Logstash (ELK) 에 로 그 를 작성 합 니 다.

버 전 확인
  "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
      ]
    }

    최선 의 실천
    여러 파일 에서 하나의 log4js 를 요구 하지 마 십시오. 하나의 응용 공용 은 하나의 log4js 를 사용 해 야 합 니 다. logstash(나 는 이 문 제 를 만 나 오랫동안 고민 했다.)
    다음 과 같이 로 그 를 쓰 는 다른 사람 은 이 파일 을 참조 하면 됩 니 다.
    // filename: logstash.js
    var log4js = require('log4js')
    var {logstash} = require('../config/default.js')
    var host = logstash.split(':')[0]
    var port = 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'
          }
        }
      },
      categories: {
        default: { appenders: ['logstash', 'console'], level: 'debug' }
      }
    })
    
    module.exports = log4js.getLogger('default')
    const log = require('./logstash.js')
    
    
    router.get('/api', (req, res, next) => {
        log.info('message coming')
    })

    주의 하 다.
  • 로 그 를 UDP 로 쓰 는 지 TCP 로 쓰 는 지 주의해 야 한다
  • Logstash (UDP and HTTP) appender 를 사용 하려 면 이 기능 이 이동 되 었 습 니 다.https://github.com/log4js-nod... 따로 설치 하 는 게 좋 을 것 같 아 요
  • 좋은 웹페이지 즐겨찾기