서버의 로그 관리를 위해 찾아보던 중, Node.js의 로그 관리 라이브러리인 morgan 에 대해 알게 되었고 쉽게 적용시킬 수 있었습니다.
우선 라이브러리를 설치해줍니다.
npm i morgan
해당 깃헙에 자세한 사용 방법이 나와 있으니, 참고하시고 제가 이용한 방법을 소개하겠습니다.
https://github.com/expressjs/morgan
우선 서버 파일에서 morgan을 불러와줍니다.
const morgan = require('morgan')
로그에 사용되는 토큰은 새롭게 정의해서 만들 수도 있습니다.
다음은 해당 라이브러리에서 미리 제공하는 토큰들입니다.
... 너무 많아서 나머지는 해당 깃헙을 참고해주세요.
morgan은 미리 정의된 포멧을 제공하고 이를 이용해서 다음과 같은 방식으로 설정할 수 있습니다.
morgan('dev')
아래와 같은 옵션이 존재합니다.
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]
:method :url :status :response-time ms - :res[content-length]
:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms
: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 });
전체 구현 내용을 정리하면 다음과 같습니다.
const fs = require('fs')
const accessLogStream = fs.createWriteStream(
`${__dirname}/../log/access.log`,
{ flags: 'a' }
)
module.exports = accessLogStream
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 라이브러리를 이용해 서버 로그를 로그 파일을 만들어 출력하는 방법에 대해 정리했습니다:)