본문 바로가기

Node.js

Node.js logging 프레임워크 winston

node.js에서 colsole 객체를 이용하여 로그를 출력할 수 있습니다. 그렇지만 프로그램의 크기가 커질 경우 로그의 양도 많아지고 저장했다가 나중에 확인해야 하는 경우가 있습니다. node.js에는 여러 logging 프레임워크가 있습니다. 이번에는 winston이라는 프레임워크에 대해 알아보겠습니다.


Winston은 다중 전송을 지원하는 간단하고 보편적인 비동기 로깅 라이브러리입니다.

로깅하는 방식을 transport라고 하며 Console, File, db등을 지원합니다. 윈스톤 로거의 각 인스턴스는 여러 수준으로 구성된 여러 전송을 가질 수 있습니다.



모듈 설치

로깅처리를 위한 Winston 의존적인 모듈 설치합니다. 

winston 기본 모듈, 파일에 일별 로테이트하며 기록하는 모듈, 그리고 시간처리 모듈을 설치합니다.

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


설정 방법

다음으로는 로그 설정 예제를 만들어보며 알아보겠습니다.


첫 번째로 winston 모듈과 일별 로테이트되면 저장되는 로테이트 모듈, 시간 모듈을 불러옵니다. 

var winston = require('winston'); // 로그 모듈
var winstonDaily = require('winston-daily-rotate-file'); //일별 로그 모듈
var moment = require('moment'); // 시간처리 모듈


두번째로 winston logger 객체를 생성하여 daily rotate file과 console 출력 및 exception 처리를 하는 것을 볼 수 있습니다.

winston을 사용하면 프로세스에서 uncaughtException 이벤트를 포착하고 로그 할 수 있습니다. 

exceptionHandler를 등록하여 uncaughtException 발생시 로그를 기록하는 것을 확인할 수 있습니다.

function timeStampFormat() {
	return moment().format('YYYY-MM-DD HH:mm:ss.SSS ZZ')
}

var logger = new (winston.Logger)({
	transports: [
		new (winstonDaily)({
				name: 'info-file',
				filename: './log/app',
				datePattern: '_yyyy-MM-dd.log',
				colorize: false,
				maxsize: 50000000,
				maxFiles: 1000,
				level: 'info', // info이상 파일 출력
				showLevel: true,
				json: false,
				timestamp: timeStampFormat
			}),
		new (winston.transports.Console)({
				name: 'debug-console',
				colorize: true,
				level: 'debug', // debug이상 콘솔 출력
				showLevel: true,
				json: false,
				timestamp: timeStampFormat
		})		
	],
	exceptionHandlers: [ // uncaughtException 발생시 처리
		new (winstonDaily)({
				name: 'exception-file',
				filename: './log/app-exception',
				datePattern: '_yyyy-MM-dd.log',
				colorize: false,
				maxsize: 50000000,
				maxFiles: 1000,
				level: 'error',
				showLevel: true,
				json: false,
				timestamp: timeStampFormat
		}),
		new (winston.transports.Console)({
				name: 'exception-console',
				colorize: true,
				level: 'debug',
				showLevel: true,
				json: false,
				timestamp: timeStampFormat
		})		
	]
});