[Node.js] morgan을 이용한 서버 로그 남기기

흑수·2022년 6월 9일
1

Node.js

목록 보기
2/3

서버의 로그 관리를 위해 찾아보던 중, Node.js의 로그 관리 라이브러리인 morgan 에 대해 알게 되었고 쉽게 적용시킬 수 있었습니다.

우선 라이브러리를 설치해줍니다.

npm i morgan

사용 방법

해당 깃헙에 자세한 사용 방법이 나와 있으니, 참고하시고 제가 이용한 방법을 소개하겠습니다.
https://github.com/expressjs/morgan

우선 서버 파일에서 morgan을 불러와줍니다.

const morgan = require('morgan')

로그에 사용되는 토큰은 새롭게 정의해서 만들 수도 있습니다.
다음은 해당 라이브러리에서 미리 제공하는 토큰들입니다.

  • :date[format]
    현재 date와 time을 UTC 포멧으로 반환합니다.
  • :http-version
    요청의 http-version을 반환합니다.
  • :method
    요청의 method를 반환합니다.
  • :remote-addr
    요청의 주소를 반환합니다.

... 너무 많아서 나머지는 해당 깃헙을 참고해주세요.

morgan은 미리 정의된 포멧을 제공하고 이를 이용해서 다음과 같은 방식으로 설정할 수 있습니다.

morgan('dev')

아래와 같은 옵션이 존재합니다.

  • combined
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"
  • common
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]
  • dev
:method :url :status :response-time ms - :res[content-length]
  • short
:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms
  • tiny
:method :url :status :res[content-length] - :response-time ms

저는 로컬 환경에서 개발할 때는 미리 정의된 dev를 이용하고 프로덕트에 적용할 때는 제가 아래와 같이 커스텀해서 적용했습니다.

[:remote-addr - :remote-user] [:date[web]] :method :url HTTP/:http-version :status :response-time ms

아래와 같이 구분해서 구현했습니다.

if (process.env.NODE_ENV === 'product'){
    app.use(morgan('[:remote-addr - :remote-user] [:date[web]] :method :url HTTP/:http-version :status :response-time ms'));
} else {
    app.use(morgan('dev'));
}

로그 파일 출력
로그 내용을 콘솔에 출력하는 것이 아니라, 파일에 저장해두고 싶다면 아래와 같이 작성하면 됩니다.
저는 따로 log.js 파일을 만들어 작성했습니다.

const fs = require('fs')

const accessLogStream = fs.createWriteStream(
    `${__dirname}/../log/access.log`,
    { flags: 'a' }
)

module.exports = accessLogStream

우선 파일 시스템을 통해 파일을 작성해야 하므로 fs를 불러 온 뒤, 스트림을 열어 작성할 수 있게 accessLogStream 함수를 선언해줍니다.

첫번째 인자로 로그 파일을 저장할 위치를 지정해주어야 합니다.
저는 src/utils/log.js에 파일을 만들었고, 해당 로그 파일은 src/log/access.log에 작성해주기 위해 다음과 같이 지정했습니다.

__dirname의 경우는 현재 디렉토리 경로를 반환해주므로 해당 파일이 있는 위치에 맞게 설정해주어야 합니다.

제가 작성한 상황은 다음과 같습니다.

__dirname -> src/utils
/.. -> src
/log/access.log -> src/log/access.log

이제 해당 파일을 불러와 morgan의 두번째 인자로 넘겨주면 됩니다. 다음과 같이 말이죠

const accessLogStream = require('./utils/log')
app.use(morgan('dev'), { stream : accessLogStream });

구현

전체 구현 내용을 정리하면 다음과 같습니다.

  • utils/log.js
const fs = require('fs')

const accessLogStream = fs.createWriteStream(
    `${__dirname}/../log/access.log`,
    { flags: 'a' }
)

module.exports = accessLogStream
  • src/index.js
const express = require('express');
const app = express();
const morgan = require('morgan')
const accessLogStream = require('./utils/log')

if (process.env.NODE_ENV === 'product'){
    app.use(morgan('[:remote-addr - :remote-user] [:date[web]] :method :url HTTP/:http-version :status :response-time ms', { stream : accessLogStream }));
} else {
    app.use(morgan('dev'));
}

감사합니다. 🙇‍♂️

morgan 라이브러리를 이용해 서버 로그를 로그 파일을 만들어 출력하는 방법에 대해 정리했습니다:)

profile
기록용

0개의 댓글