728x90
Node.js 를 개발할 때는 주로 console.log 나 console.warn, error 등을 써가면서 버그를 찾고 개발하곤 했다. 하지만 고객의 수가 늘어나고 이런저런 문제를 접하다 보니 안정적인 로깅 환경을 위해 winston 과 같은 전문 logging 시스템을 도입하고자 했다.
이를 사용하는 방법과 필자가 사용한 세팅에 대해서 설명하고자 한다.
https://github.com/winstonjs/winston
필자의 경우 debug 용 logger, production 용의 logger 를 나누어서 사용중이다.
const debugLogger = require('./debugLogger');
const productionLogger = require('./productionLogger');
let logger = null;
if (process.env.NODE_ENV !== 'production') {
logger = debugLogger();
} else {
logger = productionLogger();
}
module.exports = logger;
# 디버그용 logger (debugLogger.js)
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf } = format;
const debugLogger = () => {
const myFormat = printf(({ level, message, timestamp }) => {
return `${timestamp} ${level}: ${message}`;
});
return createLogger({
level: 'debug',
format: combine(format.colorize(), timestamp({ format: 'HH:mm:ss' }), myFormat),
transports: [new transports.Console()],
});
};
module.exports = debugLogger;
# Production 환경 logger (productionLogger.js)
const { createLogger, format, transports } = require('winston');
const WinstonDaily = require('winston-daily-rotate-file');
const path = require('path');
const { combine, timestamp, json } = format;
const logDir = `../../../logs`;
const productionLogger = () => {
return createLogger({
level: 'debug',
format: combine(timestamp(), json()),
transports: [
new transports.Console(),
// error 레벨 로그 - 파일저장
new WinstonDaily({
level: 'error',
datePattern: 'YYYY-MM-DD',
dirname: path.join(__dirname, logDir, '/error'),
filename: '%DATE%.error.log',
maxFiles: 30,
zippedArchive: true,
}),
// 모든 레벨 로그 - 파일저장
new WinstonDaily({
level: 'debug',
datePattern: 'YYYY-MM-DD',
dirname: path.join(__dirname, logDir, '/all'),
filename: '%DATE%.all.log',
maxFiles: 7,
zippedArchive: true,
}),
],
});
};
module.exports = productionLogger;
참고
https://www.youtube.com/watch?v=A5YiqaQbsyI