programing

Node.js/Express의 모든 요청을 로깅하고 있습니다.

starjava 2023. 3. 28. 20:33
반응형

Node.js/Express의 모든 요청을 로깅하고 있습니다.

small node.js 어플리케이션에서는 express를 사용하여 모든 착신 요구를 기록하고 싶었기 때문에 다음과 같은 결과가 되었습니다.

var bodyParser = require('body-parser');

module.exports = function(app) {
   app.set("port", 50001);
   app.set("json spaces", 2);
   app.use(bodyParser.json());
   app.use(function (error, req, res, next) {
      app.logger.info("received from "+req.get("X-Forwarded-For")+" : "+req.method+" "+req.originalUrl+" (Authorization: "+req.get("Authorization")+")");
      //does not work if json is malformed
      //app.logger.info("content :"+JSON.stringify(req.body));
      if (error /*instanceof SyntaxError*/) {
         res.status(400);
         app.logger.error(error);
         res.json({ error:{msg: error.message}});
      } else {
         next();
      }
   });
   app.use(app.auth.initialize());
};

유감스럽게도 로그는 다음 경로에서만 얻을 수 있습니다.app.logger.info행에 오류가 있을 경우(본문에 잘못된 형식의 JSON 문자열이 있습니다.내가 뭘 놓쳤지?

Expressjs는 사용자가 제공하는 콜백의 유형에 따라 기능을 조정합니다(JS 라이브러리에서는 일반적이지 않으므로 사람들이 이 콜백에 대해 혼동하는 것은 놀랄 일이 아닙니다).

콜백에 4개의 인수가 있는 경우에 이 작업을 수행할 경우:

app.use(function(error, req, res, next) {...});

그러면 Express는 이것이 오류 전용 미들웨어 핸들러라고 가정하고 오류가 발생했을 때만 호출됩니다.Express Doc에서 오류 처리 미들웨어 섹션을 참조하십시오.이 페이지의 특정 부분에 주의해 주세요.

에러 처리 미들웨어 함수를 다른 미들웨어 함수와 같은 방법으로 정의합니다.단, 3개의 인수가 아닌4개의 인수, 특히 시그니처(err, req, res, next)를 사용합니다.

여기에서는 미들웨어 오류 처리에 관한 문서의 전체 섹션을 소개합니다.

인수를 3개만 사용하는 경우:

app.use(function(req, res, next) {...});

그러면 오류가 없을 때 호출되는 일반적인 미들웨어입니다.그들이 둘 다 구할 수 있는 단일 방법을 제공하는지 잘 모르겠어요.다만, 회피책으로서 로그 코드를 함수에 삽입해, 그 함수를 2개의 다른 미들웨어 핸들러로부터 호출할 수 있습니다.하나는 에러용이고 다른 하나는 에러용이 아닙니다.

morgan https://github.com/expressjs/morgan 사용

Morgan 설치

$ npm install morgan

index.js, app.js 또는 server.js 파일에 morgan을 포함합니다(package.json의 스크립트태그로 가리킨 파일).

var morgan = require('morgan')

그런 다음 모든 앱 호출 전에 아래를 추가하십시오.

app.use(morgan('combined'))

완전한 예

var express = require('express')
var morgan = require('morgan')

var app = express()

app.use(morgan('combined'))

app.get('/', function (req, res) {
  res.send('hello, world!')
})

출력 라인의 예는 다음과 같습니다.

::1 - - [31/May/2021:09:03:14 +0000] "GET / HTTP/1.1" 200 2078 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"

DEBUG='*'또는DEBUG='express:router'환경 변수

요청에 대한 많은 정보가 표시되지 않지만 경로와 방법이 표시되므로 기본 애플리케이션에 충분할 수 있으며 추가 설정이 필요하지 않으므로 편리합니다.

DEBUG='*'는 모든 로그를 활성화하고 입력이 약간 쉬워집니다.

DEBUG='*' ./app.js

또는 좀 더 구체적으로DEBUG='express:router'많은 미들웨어가 있는 복잡한 어플리케이션에서는 일반적으로 필요한 것이 있습니다.그렇지 않으면DEBUG='*'을 사용하다

DEBUG='express:router' ./app.js

예: hello world:

#!/usr/bin/env node

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

그런 다음 다른 URL을 사용하여 브라우저에서 재생하면 다음과 같은 로그를 볼 수 있습니다.

  express:router dispatching GET / +3m
  express:router query  : / +0ms
  express:router expressInit  : / +0ms
  express:router dispatching GET /asdf +10s
  express:router query  : /asdf +0ms
  express:router expressInit  : /asdf +0ms
  finalhandler default 404 +3m
  express:router dispatching GET /asdf?qwer=zxcv +17s
  express:router query  : /asdf?qwer=zxcv +0ms
  express:router expressInit  : /asdf?qwer=zxcv +0ms
  finalhandler default 404 +17s

자료: https://expressjs.com/en/guide/debugging.html

Express 4.17.1에서 테스트 완료.

npm install body-parser

npm install morgan-body

이 스니펫을 사용해서

const express = require('express')
const morganBody = require("morgan-body")
const bodyParser = require("body-parser")

const app = express()
const port = 8888

// must parse body before morganBody as body will be logged
app.use(bodyParser.json());

// hook morganBody to express app
morganBody(app, {logAllReqHeader:true, maxBodyLength:5000});

app.get('/', (req, res) => {
  res.send('Hello World!')

})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

grackle_tracking npm 라이브러리를 사용하여 모든 트래픽을 콘솔에 쉽게 로그아웃하거나 데이터베이스에 기록할 수 있습니다.또, 미처리/캐치 에러도 추적할 수 있습니다.또, 다른 환경에서도 간단하게 온/오프 할 수 있습니다.

grackle_tracking.configure({...configuration...});
app.use(grackle_tracking.track);

따라서 https://www.getgrackle.com/libraries#grackle_tracking_overview를 추적하고 싶지 않은 환경/사용자에 대해 둘 다 또는 단순히 코멘트할 수 있습니다.

try/catch를 사용할 수 있습니다.

try {
   var jsonBody = JSON.stringify(req.body);
   app.logger.info("content :" + jsonBody);
} catch (err) { 
    app.logger.error("content error, error type: invalid json, error msg:" + err);
}

언급URL : https://stackoverflow.com/questions/42099925/logging-all-requests-in-node-js-express

반응형