Node JS로 서버를 개발하면서 필요한 부분 중 하나는 로그를 기록하는 것이다.
오늘은 Node JS 개발에 가장 많이 사용되는 logger 패키지인 winston과 http request를 기록(?)할 수 있는 morgan을 사용하여 로그를 남기는 법을 작성해볼 것이다.
우선 npm install winston winston-daily-rotate-file
패키지를 설치한다.
그리고 winston.js
파일을 생성하여 아래와 같이 작성해준다.
import winston from 'winston';
import winstonDaily from 'winston-daily-rotate-file';
const logDir = 'logs'; // log가 저장될 디렉토리
const { combine, timestamp, printf } = winston.format;
// Define log format
const logFormat = printf(info => {
return `${info.timestamp} | ${info.level} | ${info.message}`;
});
/*
* Log Level
* error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6
*/
const logger = winston.createLogger({
format: combine(
timestamp({
format: 'YYYY-MM-DD HH:mm:ss a',
}),
logFormat,
),
transports: [
// info 레벨 로그를 저장할 파일 설정
new winstonDaily({
level: 'http',
datePattern: 'YYYY-MM-DD',
dirname: logDir,
filename: `%DATE%.log`,
maxFiles: 30, // 30일치 로그 파일 저장
zippedArchive: true,
}),
// error 레벨 로그를 저장할 파일 설정
new winstonDaily({
level: 'error',
datePattern: 'YYYY-MM-DD',
dirname: logDir + '/error', // error.log 파일은 /logs/error 하위에 저장
filename: `%DATE%.error.log`,
maxFiles: 30,
zippedArchive: true,
}),
// Console로 출력
new winston.transports.Console({
level: 'http',
format: winston.format.combine(
winston.format.colorize(), // 색깔 넣어서 출력
logFormat,
)})
],
});
export { logger };
로그는 error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 이러한 종류가 있고 숫자가 낮을수록 우선순위가 높다. 그래서 예를 들어 level을 http로 설정하더라도 http erro, warn, info까지 모두 포함된 로그가 기록된다.
logger는 아래와 같이 logger.error/warn/info...('message') 으로 사용한다.
logger.info(`Example app listening on port ${port}`);
서버를 실행하면 콘솔 로그와 로그 파일이 생기는 것을 확인할 수 있다.
우선 npm install morgan --save
로 morgan을 설치합니다.
morgan은 format을 combined, common, dev 등과 같이 줄 수 있는데 자세한 옵션은 여기서 확인하면 된다. 나는 winston 쪽에서 이미 날짜와 시간을 설정해주는 부분을 넣었기 때문에 format을 커스터마이징해서 combined과 common 포맷에서 날짜/시간 부분([:date[clf]])만 지웠다.
그리고 morganMiddleware.js 파일을 생성하여 아래와 같이 작성해준다.
import {logger} from "@/config/winston";
import morgan from "morgan";
const combined = ':remote-addr - :remote-user ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'
const common = ':remote-addr - :remote-user ":method :url HTTP/:http-version" :status :res[content-length]'
const format = () => {
return process.env.NODE_ENV === 'prd' ? combined : common
}
const stream = { write: (message) => logger.http(message) }
const skip = (_, res) => {
if (process.env.NODE_ENV === 'prd') return res.statusCode < 400
return false
}
const morganMiddleware = morgan(format(), { stream, skip })
export {morganMiddleware};
이제 index.js 파일로 가서 morganMiddleware를 넣어준다!
postman을 통해 요청을 하나 날려보면 아래와 같이 http요청에 대한 로그가 잘 남는 것을 확인할 수 있다.
참고