본문 바로가기

NodeJS

winston - NodeJS 로깅 라이브러리 :: DANIDANI

설치방법

npm install --save winston 
npm install --save winston-daily-rotate-file

config 디렉터리에 새 파일을 생성(winston.js)

const winston = require('winston');
const winstonDaily = require('winston-daily-rotate-file');

const logDir = 'logs';  // logs 디렉토리 하위에 로그 파일 저장
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',
        }),
        logFormat
    ),
    transports: [
        // info 레벨 로그를 저장할 파일 설정
        new winstonDaily({
            level: 'info',
            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,
        }),
    ],
});

module.exports = logger;

app.js에 logger 추가

const winston = require('./config/winston')

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  const ip = req.headers['x-forwarded-for'] ||  req.connection.remoteAddress;
  winston.error(err.status+" "+ req.method+" "+req.url+" "+err.message+ " "+ip);
  res.status(err.status || 500);
  res.render('error');
});

사용방법

1)  성공 시 info 로그 예시

const winston = require('./config/winston')

const ip = req.headers['x-forwarded-for'] ||  req.connection.remoteAddress;
winston.info(
	statusCode.OK+" "+ 
	req.method+" "+
	req.url+" "+
	responseMessage.SUCCESS+ " "+
	ip
);

2) 에러시 error 로그 예시

const winston = require('./config/winston')

const ip = req.headers['x-forwarded-for'] ||  req.connection.remoteAddress;
winston.error(
	err.status+" "+ 
	req.method+" "+
	req.url+" "+
	err.message+ " "+
	ip
);

로그 확인

프로젝트/logs에 날짜별로 저장되어 있음.

2020-11-27 13:14:36 info: 200 GET / 로깅 테스트 성공 ::1
2020-11-27 13:15:05 error: 404 GET /file Not Found ::1
2020-11-27 13:19:16 info: 200 GET / 메인 페이지 불러오기 성공 ::1
2020-11-27 13:19:25 info: 200 GET / 로깅 테스트 성공 ::1
2020-11-27 13:19:28 error: 404 GET /file Not Found ::1

 


참고

www.notion.so/winston-NodeJS-b7741350e96947a597ce44b19351af48#8580c346ff1946edb68860c0dd045476

 
728x90