본문 바로가기

Programming/일반

[Node.js][Log] morgan으로 http request 로그를 남겨보자

이전 글에서 winston으로 log를 기록하는 방법에 대해 글을 써봤다. 이번엔 winston과 morgan을 사용해서 어떻게 http request를 기록할 수 있는지에 대해 작성해보았다. 

morgan으로 http request 로그를 남겨보자

winston

winston!

 

winstonjs/winston

A logger for just about everything. Contribute to winstonjs/winston development by creating an account on GitHub.

github.com

winston은 이전 글에서 사용법에 대해 자세하게 적었으니 기본 세팅만 해두고 넘어가려고한다. 혹시 이전 글을 못봤다면, 여기서 볼 수 있다. 

npm install --save winston

logger 생성하기

// src/logger.ts

const logger = winston.createLogger({
  format: combine(
    colorize({ level: true }),
    label({ label: 'EXPRESS_PLAYGROUND' }),
    timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    printf(info => `${info.timestamp}_${info.level}__[${info.label}]: ${info.message}`)
  ),
  transports: [
    new winston.transports.Console({ level: 'silly' }),
    new winston.transports.File({
      level: 'debug',
      filename: 'debug.log',
      dirname: process.cwd() + '/log'
    })
  ]
});

morgan

morgan!

 

expressjs/morgan

HTTP request logger middleware for node.js. Contribute to expressjs/morgan development by creating an account on GitHub.

github.com

뭔가 이름이 신기해서 찾아보니 미드 Dexter Morgan의 이름에서 따왔다고 한다. (장난치는게 아니라 진짜 Github README에 적혀있음...)

Morgan은 http request들을 로그할 수 있도록 도와주는 미들웨어이다. 엄청나게 많은 http 요청이 이루어지는 API에서 문제가 생겼을 때, 어느 시점에서 어떤 요청에서 에러가 났는지 확인해보려면 어떻게 해야할까? 이때 morgan을 사용하면 된다. 

 

거두절미하고, morgan의 사용법에 대해 알아보자. morgan을 먼저 설치하자.

npm install --save morgan

 

logger의 http 레벨을 사용해서 stream에 들어오는 모든 message를 기록하도록 한다. 

// src/logger.ts

const httpLogStream = {
  write: (message: string) => { logger.http(message); }
};

 

이렇게 http stream을 만들고, express app에 미들웨어를 추가해주자. 

// src/server.ts
import morgan from 'morgan';
import express, { Application } from 'express';

const app: Application = express();

app.listen(3000, (err) => {
  if (err) {
    logger.error(err);
    return;
  }
  logger.info('Ready to start SERVER, listening port 3000');
});

app.use(morgan('dev', { stream: httpLogStream }));

morgan(format, options)

여기선 'dev' 포맷을 사용했는데, 사전에 정의된 dev 포맷은 다음과 같다.

:method :url :status :response-time ms - :res[content-length]

정의된 포맷대로 출력되는지 확인해보자. 

logger의 format과 morgan의 format이 합쳐져서 로그가 제대로 찍히는 것을 확인할 수 있다. 각자 정의한 API대로 요청을 보내 log를 확인해보자. 


마치며... 👩🏻‍💻

로그는 정말 중요하다. 꼭! 로그 시스템부터 만드는 습관을 들여보자

최근들어서 Logging System과 Testing에 대해서 공부하고 있다. 틈날때마다 추가하고 있으니 도움이 되길 바라며...

[seohyun0120/logandtest-playground]

 

seohyun0120/logandtest-playground

playground for logging, testing. Contribute to seohyun0120/logandtest-playground development by creating an account on GitHub.

github.com

 

반응형