Node.js는 log를 효율적이게 관리 할 수 있게 도와주는 모듈 winson.js가 있습니다.
개발할 때는 console.log를 사용해서 오류를 체크할 수 있지만, 실제 서버가 작동 중일 때는 사용할 수 없습니다.
이럴 때 winston을 통해서 시스템을 운영하면서 오류, 장애가 발생했을 때 외부 파일에 저장합니다.
const winston = require('winston'); //윈스턴 모듈
const winstonDaily = require('winston-daily-rotate-file'); // 로그 파일을 일자별로 생성
const logFormat = printf(({level, message, label, timestamp}) => {
return `${timestamp} [${label}] ${level} ${message}`
}) // 로그 출력 포맷 정의
const logger = winston.createLogger({
format : combine(
label({
label : 'System Name'
}), // 어플리케이션 이름
timestamp({
format : 'YYYY-MM-DD HH:mm:ss'
}),
logFormat // log 출력 포맷
)
transports : [ // 실제 로그를 어떻게 기록할 것일까 정의
new winstonDaily({
level : 'info', //info레벨
datePattern : 'YYYY-MM-DD', // 파일 날짜형식
dirname : './log', // 파일 경로를 입력합니다. 같은 폴더내에 'log'폴더에 저장한다는 말입니다
filename : `%DATE%.log`, // 파일 이름
maxFiles : 30, //최근 30일치 파일만 저장
zippedArcive : true // 아카이브된 로그 파일을 gzip으로 압축할지 여부
}),
//info 레벨 로그를 저장할 파일 설정
new winstonDaily({
level : 'error', // error 레벨에선
datePattern : 'YYYY-MM-DD',
dirname: './log',
filename : `%DATE%.error.log`,
maxFiles : 30,
zippedArchive : true
})
// error 레벨 로그를 저장할 파일 설정
],
//에러 잡지 못한 경우
exceptionHandlers: [
new winstonDaily({
level: 'error',
datePattern: 'YYYY-MM-DD',
dirname: './logs',
filename: `%DATE%.exception.log`
})
]
})
// 운영환경이 아닌 경우 콘솔로도 로그 출력
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format : winston.format.combine(
winston.format.colorize(), //색상 넣어서 출력
winston.format.simple() // 간단한 포맷으로 출력
)
})
})
에러를 날리면 해당 폴더내에 파일이 생기는 걸 볼 수 있습니다.
<Node.js 프로젝트 투입 전>
https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-Winston-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%84%9C%EB%B2%84-%EB%A1%9C%EA%B7%B8-%EA%B4%80%EB%A6%AC