본문 바로가기
STUDY/NodeJS

[4-2] HTTP 요청에 대한 정보를 로그로 출력해주는 미들웨어 - Morgan

by Y.Choi 2023. 3. 28.
728x90
반응형

morgan은 HTTP 요청에 대한 로그를 출력하는 미들웨어로, Express.js에서 자주 사용됩니다.

 

morgan은 다양한 로그 포맷을 지원하며, 미들웨어로 사용하면 HTTP 요청에 대한 다양한 정보를 출력할 수 있습니다.

예를 들어, 요청의 HTTP 메소드, URL, 상태 코드, 응답 시간 등을 출력할 수 있습니다.

 

 

> 설치하기

npm install morgan

 

> 사용하기

const express = require('express');
const morgan = require('morgan');

const app = express();

// 로그 포맷 지정
const logFormat = '[:date[iso]] :method :url :status :response-time ms - :res[content-length]';

// 미들웨어 등록
app.use(morgan(logFormat));

// 라우트 등록
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// 서버 실행
app.listen(3000, () => {
  console.log('Server started on port 3000');
});

 

morgan 모듈을 require하여 가져온 후, 로그 포맷을 지정합니다. 

 

 

> 로그 포맷 

문자열로 지정할 수 있으며, 다양한 옵션을 지원합니다. 

 

:date[iso] -현재 날짜 및 시간을 ISO 형식으로 출력합니다.
:method - HTTP 메서드를 출력합니다.
:url - 요청 URL을 출력합니다.
:status - HTTP 상태 코드를 출력합니다.
:response-time - 요청에 대한 응답 시간을 밀리초(ms) 단위로 출력합니다.
:res[content-length] - 응답 본문의 크기를 출력합니다.

 

더 많은 포맷

더보기

:date[format] : 로그에 날짜를 포함시킵니다. format은 원하는 날짜 형식으로 지정할 수 있습니다. (clf, iso, web 등)
:method : HTTP 메서드를 표시합니다. (GET, POST, PUT, DELETE, PATCH 등)
:url : 요청 URL을 표시합니다.
:status : HTTP 응답 상태 코드를 표시합니다.
:response-time : 요청과 응답 처리에 걸린 시간을 표시합니다. (단위는 ms)
:remote-addr : 요청을 보낸 클라이언트 IP 주소를 표시합니다.
:http-version : 사용된 HTTP 버전을 표시합니다. (1.0, 1.1, 2, 3 등)
:user-agent : 요청을 보낸 클라이언트의 User Agent 정보를 표시합니다.
:referrer : 요청을 보낸 Referer URL 정보를 표시합니다.
:res[header] : 응답 헤더 값을 표시합니다. (content-length, content-type, date 등)
:remote-user : 인증된 사용자의 이름을 표시합니다.
:req[header] : 요청 헤더 값을 표시합니다. (referer, user-agent, accept-language 등)
:res[content-length] : 응답 본문의 길이를 표시합니다.
:res[content-type] : 응답 본문의 MIME 타입을 표시합니다.
:req[X] / :res[X] : HTTP 요청과 응답에서 특정 X 값을 표시합니다. (X는 헤더 이름 또는 다른 값을 의미하는 문자열)

 

이외에도 다양한 옵션들이 있으며, morgan 공식 문서에서 확인할 수 있습니다. 

 

 

이제 서버를 실행하고 브라우저에서 http://localhost:3000에 접속하면, 미들웨어에 의해 로그가 출력됩니다.

 

morgan 로그 출력

 

> morgan 옵션

 

stream 

로그를 출력할 스트림을 설정합니다. 기본값은 process.stdout입니다.

 

skip 

로깅을 생략할지 여부를 결정하는 함수입니다. 인자로 req, res를 받아 로깅을 스킵할지 여부를 결정하면 됩니다.

 

immediate 

즉시 로그를 출력할지 지연해서 출력할지 여부를 결정하는 옵션입니다. 기본값은 false입니다.

 

maxBodyLength

로깅에 포함할 요청 본문(body)의 최대 크기를 바이트 단위로 설정합니다. 기본값은 undefined입니다.

 

req 

HTTP 요청 객체(req)를 포맷에 추가합니다. 인자로 요청 프로퍼티를 배열로 입력할 수 있습니다.

 

res 

HTTP 응답 객체(res)를 포맷에 추가합니다. 인자로 응답 프로퍼티를 배열로 입력할 수 있습니다.

 

format

사용자 정의 포맷 문자열을 입력할 수 있습니다. 포맷 문자열 내에서 :method, :url, :status 등의 토큰을 사용할 수 있습니다.

위 옵션들을 조합하여 로그를 상세하게 설정할 수 있습니다.

 

 

 

morgan의 option을 사용하여 로그를 커스터마이징할 수 있습니다. 예를 들어, 다음과 같은 옵션을 사용하여 IP 주소와 브라우저 정보를 로그에 추가할 수 있습니다.

 

 

// 로그 포맷 설정
const logFormat = '[:date[iso]] :method :url :status :response-time ms - :res[content-length] :remote-addr :user-agent';

// morgan 미들웨어 등록
app.use(morgan(logFormat, {
  skip: function (req, res) { return res.statusCode < 400 },
  stream: process.stdout
}));

 

위의 예시에서는 :remote-addr와 :user-agent를 추가로 설정하였으며, option으로 skip과 stream을 사용하였습니다.

skip: 특정 조건을 만족하는 경우 로그를 출력하지 않도록 설정할 수 있습니다. 위의 코드에서는 statusCode가 400 미만인 경우 로그를 출력하지 않습니다.


stream: 로그를 어디로 출력할지 설정할 수 있습니다. 위의 코드에서는 표준 출력으로 설정하였습니다.
위와 같이 morgan의 option을 사용하면 로그를 보다 세부적으로 커스터마이징할 수 있습니다.

 

 

 


 

 

- 로그포맷 사용자 정의하는 방법

 

728x90
반응형