Study/Node.js

[노드JS] 로그 파일 남기기

AC 2019. 3. 23. 23:31



『로그 파일 남기기

_____________________


console 객체의 log() 또는 error() 메소드 등을 호출하면 로그를 출력할 수 있다. 그런데 프로그램의 크기가 커질수록 로그의 양도 많아지고 로그를 보관했다가 나중에 확인해야 하는 경우도 생긴다. 따라서 어떻게 로그를 남기고 보관할 것인지가 중요해진다.




로그를 보관하려면 화면에만 출력하는 것만으로는 부족하다. 이 때문에 다양한 방시긍로 로그를 남길 수 있도록 외부 모듈을 사용한다.



여기에서는 여러 가지 로그 모듈중에서 winston 모듈로 로그를 남기는 방법을 알아보자.


로그를 남기려면 설정이 필요하다. 이렇게 설정한 코드는 한번 만들어 두면 그대로 복사한 후 일부 설정만 바꾸어 다른 프로그램에도 사용할 수 있다. 그렇기 때문에 처음 코드를 만들 때 그 코드의 사용 방법을 잘 이해하는 것이 중요하다.


새로운 ch04_test15.js 파일을 만들고 다음 코드를 그대로 입력한다.



------------------------------------------------------------------------


var winston = require('winston'); // 로그 처리 모듈

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

var moment = require('moment'); // 시간 처리 모듈


function timeStampFormat(){

    return moment().format('YYYY-MM-DD HH:mm:ss.SSS ZZ');

    // ex) '2019-03-23 11:03:24

};


var logger = new (winston.Logger)({

   transports: [

       new (winstonDaily)({

           name : 'info-file',

           filename : './log/server',

           datePattern: '_yyyy-MM-dd.log',

           colorize : false,

           maxsize : 50000000,

           maxFiles : 1000,

           level : 'info',

           showLevel : true,

           json : false,

           timestamp : timeStampFormat

       }),

       new (winston.transports.Console)({

            name : 'debug-console' ,

            colorize : true,

           level : 'debug',

           showLevel: true,

           json : false,

           timestamp : timeStampFormat

        

       })

   ],

    exceptionHandlers : [

        new (winstonDaily)({

           name : 'exception-file',

            filename : './log/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

        })

    ]

});


------------------------------------------------------------------------



코드의 양이 조금 많아 뵈지만 실무에서 사용할 수 있는 로그 설정을 만들기 위해서는 이 정도의 코드가 필요하다.


winston 모듈로 만드는 로거(Logger, 로그를 출력하는 객체를 말할 때 사용하는 용어)는 transports라는 속성 값으로 여러 개의 설정 정보를 전달할 수 있다. 


이름이 info-file인 설정 정보는 매일 새로운 파일에 로그를 기록하도록 설정하고, info 수준의 로그만 기록하도록 설정하였다. 로그 파일의 크기가 50MB를 넘어가면 자동으로 새로운 파일로 생성되며, 이 때 자동으로 분리되어 생성되는 파일의 개수는 최대 1000개 까지 가능하다.


이런 정보들은 name, level, maxsize, maxFiles 등의 속성으로 설정한다.


콘솔 창에 출력되는 로그는 debug 수준까지 출력되도록 설정하고 컬러도 적용하였다.



 여기까지 했는데 왜 안되는 거지? 뭐가 부족한가?



※ 로그 수준(Log Lovel)이란?

로그 수준이란 어떤 정보까지 출력할 것인지 결정하는 것을 말한다.

예를 들어, 오류만 보여줄 것인지 아니면 사소한 정보까지 모두 보여줄 것인지를 로그 수준으로 결정한다. winston 모듈에서 사용하는 로그 수준은 다음처럼 단계별로 구성되며, 하위수준은 상위 수준을 모두 포함하여 출력한다.


debug : 0 > info : 1 > notice : 2 > warning : 3 > error : 4> crit : 5 > alert: 6 > emerg : 7


우리들이 만드는 프로그램 별로 로그 파일의 이름을 다르게 기록해야 한다.


그러니 앞에서 살펴본 코드를 복사하여 다른 프로그램에서 사용하고 싶다면 파일 이름이나 설정 부분을 약간씩 수정하면서 사용하자.



ch04_test15.js 파일은 winston 모듈 외에 winston-daily-rotate-file 모듈과 시간을 다룰 수 있는 moment 모듈도 함께 사용한다.


따라서 파일을 실행하기 전에 먼저 다음과 같이 명령 프롬프트에서 모듈을 설치해야 한다.



로그를 설정하는 코드 아래에는 output.txt 파일을 복사하면서 로그를 남기는 코드가 들어 있다.


따라서 파일 탐색기를 열고 로그 파일이 저장될 [log] 폴더를 만든 후 ch04-test15.js파일을 실행하면 다음과 같이 로그 파일이 만들어지는 것을 확인할 수 있다. 


winston 모듈은 로그를 파일로 저장하면서 동시에 화면에 출력되도록 설정할 수 있다. 로그를 파일이나 화면에 출력하고 싶다면 logger 객체에 들어 있는 debug(), info(), error()와 같은 메소드를 호출하면 된다. logger.debug() 메소드를 호출하면서 글자를 넣으면 다음과 같이 콘솔에 그 글자가 출력된다.







LIST