본문 바로가기

Backend/Node.js

Node.js Logging 설정 (winston)

NodeJS에서 로그를 남겨볼게요.

어떤 서버든지 실제로 서비스를 운영하려면 로그 남기는 것은 필수에요.

특히, 로그 파일만 보고 error가 정확히 어떤 파일의 몇 번째 라인에서 발생했는지 남는 것이 중요해요.

중요한 info 로그도 남길 수 있어야 해요.

 

예제를 통해 알아볼게요.

우선 아래 모듈을 설치해주세요.

 

npm install winston winston-daily-rotate-file

logger.js

아래 코드를 복사하여 원하는 경로에 넣어주세요. 저는 config라는 폴더를 만들어서 넣었어요.

logDir 경로는 로그 파일이 저장되는 경로에요.

코드 적용하실 때에 logDir은 필수로 수정해주세요.

 

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

const logDir = '/Users/hong/Logs/node-express'
const { combine, timestamp, printf } = winston.format

const logFormat = printf(({ timestamp, level, message, stack }) => {
  if (stack) return `${timestamp} ${level} - ${message}\n${stack}`
  else return `${timestamp} ${level} - ${message}`
})

var logger = winston.createLogger({
  format: combine(
    timestamp({
      format: 'HH:mm:ss.SSS',
    }),
    logFormat,
  ),
  transports: [
    new winstonDaily({
      level: 'info',
      datePattern: 'YYYY-MM-DD',
      dirname: logDir,
      filename: `app.%DATE%.log`,
      maxFiles: 10,
      zippedArchive: true,
    }),
    new winstonDaily({
      level: 'error',
      datePattern: 'YYYY-MM-DD',
      dirname: logDir,
      filename: `error.%DATE%.log`,
      maxFiles: 30,
      zippedArchive: true,
    }),
  ],
})

if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: winston.format.combine(
      winston.format.colorize()
    )
  }))
}

module.exports = logger

 

설정은 파일 하나가 끝이에요.

이제 로그를 찍어볼게요.

 

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

logger.info('로그인')

 

이번엔 에러 로그를 찍어볼게요.

logger.info 와 동일하게 메시지만 찍어도 되지만 try ~ catch 에서 잡히는 stack 정보도 찍을 수 있어요.

시간, 레벨, 메시지가 한 줄 찍히고 밑으로 stack 정보가 출력될거에요.

이 부분은 logger.js 설정의 logFormat을 참고해주세요.

 

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

try {
  // TODO
} catch (err) {
  logger.error(err)
}

 

 

보다 더 자세한 내용은 아래 npm package 문서를 참고해주세요.

www.npmjs.com/package/winston

 

winston

A logger for just about everything.

www.npmjs.com