본문 바로가기

노드

[node.js] morgan "HTTP 요청과 응답에 관련한 정보를 기록하는 미들웨어"

반응형

morgan

 Node.js 웹 애플리케이션에서 * HTTP 요청 로깅을 위한 로깅 미들웨어 패키지입니다. 이 패키지는 HTTP 요청의 상태 코드, 응답 시간, 요청 메소드, 요청 URL, 요청 바디 등을 기록할 수 있습니다. 즉, 클라이언트 측과 서버 측 사이에서 HTTP 요청과 응답 사이에 발생하는 정보들을 기록해주는 미들웨어 입니다. 

Morgan 패키지는 사용하기 쉽고 유연합니다. 기본적으로 콘솔에 로그를 출력하지만, 파일에 로그를 저장하거나 로그를 다른 곳으로 전송하는 등 로깅을 다양한 방식으로 구성할 수 있습니다. 또한 로그 포맷을 구성할 수 있어서, 개발자가 원하는 대로 로그를 출력할 수 있습니다.

Morgan 패키지는 Node.js의 Express 프레임워크와 함께 많이 사용됩니다. Express 애플리케이션에서 Morgan 미들웨어를 사용하면, 애플리케이션의 HTTP 요청 및 응답에 대한 로그를 쉽게 기록할 수 있습니다.
 
 
* HTTP 요청 로깅

더보기
HTTP 요청 로깅은 HTTP 클라이언트와 HTTP 서버 간의 통신에서 발생하는 HTTP 요청 및 응답에 대한 정보를 기록하는 것입니다. 이러한 정보는 웹 개발자가 애플리케이션의 성능 문제나 보안 문제를 파악하는 데 도움이 됩니다.

HTTP 요청 로깅은 다양한 정보를 포함할 수 있습니다. 예를 들어, HTTP 메소드(GET, POST, PUT 등), 요청 URL, 요청 IP 주소, 응답 상태 코드, 응답 크기, 요청 및 응답 시간, 사용자 에이전트 정보, Referrer 정보 등을 로깅할 수 있습니다.

HTTP 요청 로깅은 일반적으로 로그 파일에 기록됩니다. 이러한 로그 파일은 애플리케이션의 동작을 추적하고 디버깅하는 데 사용됩니다. 또한 로그 파일을 분석하여 애플리케이션의 성능을 개선하는 데도 사용될 수 있습니다.

morgan 사용 예시 코드

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

const app = express();

// Morgan 미들웨어를 사용하여 로깅을 구성합니다.
app.use(morgan('combined'));

// GET 요청에 대한 핸들러를 등록합니다.
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// 애플리케이션을 3000번 포트에서 실행합니다.
app.listen(3000, () => {
  console.log('Example app listening on port 3000!');
});
::1 - - [16/Mar/2023:11:50:51 +0000] "GET / HTTP/1.1" 200 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"

morgan 의 옵션

Morgan 패키지는 로그 출력 형식을 다양하게 지원합니다. 일부 일반적인 로그 형식을 살펴보면 다음과 같습니다.
 

* Apache Common Log Format

더보기

Apache Common Log Format은 웹 서버 로그를 기록하기 위해 아파치 웹 서버에서 사용되는 표준 로그 형식입니다. 이 로그 형식은 다양한 웹 서버에서 사용되며, 일반적으로 텍스트 파일로 저장됩니다.

Apache Common Log Format은 다음과 같은 정보를 기록합니다:

 

 

- 클라이언트 IP 주소

- 요청이 수신된 시간
- 클라이언트와 서버 간 통신에 사용된 HTTP 메소드
- 요청한 파일의 경로
- HTTP 응답 코드

- 요청에 대한 HTTP 응답의 바이트 수

 


이 로그 형식은 웹 서버 관리자가 웹 사이트의 트래픽 패턴을 이해하고 웹 사이트의 성능 문제를 해결하는 데 도움이 됩니다. 또한, 웹 애플리케이션의 보안 문제나 사이트 침해 여부를 파악하는 데도 사용될 수 있습니다.

 

보통 다음과 같은 형식으로 작성됩니다.

 

127.0.0.1 - - [16/Mar/2023:09:32:22 -0700] "GET /index.html HTTP/1.1" 200 2048


morgan('common')

 * Apache Common Log Format과 비슷한 형식으로 로그를 출력합니다.

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

와 같은 형식을 따릅니다.
 

morgan('combined')

Apache Combined Log Format과 비슷한 형식으로 로그를 출력합니다.

:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"

와 같은 형식을 따릅니다.
 

morgan('dev')

개발용 로그 형식으로,

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

와 같은 형식으로 출력합니다.
 

morgan('short')

간단한 형식으로,

:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms

와 같은 형식을 따릅니다.
 
 
이외에도 Morgan 패키지는 사용자 정의 로그 형식을 지원합니다. 사용자 정의 로그 형식을 사용하려면, 문자열 대신 함수
를 전달해야 합니다. 예를 들어, 다음과 같이 사용자 정의 로그 형식을 지정할 수 있습니다.

app.use(morgan((tokens, req, res) => {
  return [
    tokens.method(req, res),
    tokens.url(req, res),
    tokens.status(req, res),
    tokens['response-time'](req, res), 'ms'
  ].join(' ');
}));


위 예제에서는 tokens 객체를 사용하여 로그 형식을 구성하고 있습니다. tokens 객체는 Morgan에서 제공하는 로그 토큰으로, HTTP 요청 및 응답에서 추출된 정보를 가지고 있습니다. 이러한 로그 토큰은 Morgan의 API 문서에서 확인할 수 있습니다.




반응형