오늘은 NodeJS의 모듈 중 Winston을 사용해서,

Logging을 하는 것에 대해서 정리해 보겠습니다.



1. winston 설치


제일 먼저 해야할 것은 winston 모듈을 설치하는 것인데요.

아래 명령어로 winston을 설치해 줍니다.


npm install winston --save


그럼 아래와 같이 winston과 하위 모듈들이 설치된 것을 볼 수 있습니다.



이제, 설치가 된 winston을 변수에 담아서 사용해야 하는데요.

winston이라는 변수에 담아서 사용하겠습니다.


const winston = require('winston');


2. Logging Level


본격적으로 winston에 대해서 알아보기 전에,

사용할 수 있는, 로깅 레벨에 대해서 알아보겠습니다.

다음과 같이 6단계로 나누어 사용할 수 있습니다.


error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5

(https://github.com/winstonjs/winston)



3. logger생성


winston에서 logging을 하기 위해서는, logger객체를 생성해야 하는데요.
(디폴트 logger를 사용하는 방법도 있지만, logger객체를 생성해서 사용하는 것을 권장합니다)

생성한 logger객체를 이용해서, file, console, db, mail 형태로 로그를 전환할 수 있습니다.
이런 이유 때문인지, 프로퍼티 값으로 transports라는 용어를 사용합니다.

logger객체를 만들기 위해서는 아래 이미지와 같이 하는데요.
transport방법(file, db, mail, console중 logging할 방법) 에 대해서 정의해 주어야 합니다.
여기서는 Console형태로 정의하였습니다.


level은 <2. LogginLevel>의 winston logging Level을 의미하구요.

info라고 해서, info레벨만 로깅하는 것은 아니구요.

info레벨 이하의 것들을 로깅한다는 의미입니다.


transports는 배열로 Console, file, db 등 여러가지를 넣을 수 있는데요.
여기서는 winston.transports.Console을 넣어서,
Console창에 로깅을 할 수 있도록 하였습니다.

transports값은 변수로 미리 담아놓고, clear()메소드를 이용해, 모든 transport를 삭제하거나,
add()나 remove() 메소드에 인자로 transport를 사용해서, 추가 및 삭제도 가능합니다.

그럼 아래에서, file로 저장하는 방법에 대해서도 알아보겠습니다.


4. file로 Logging 저장


먼저 logging한 파일을 저장할 디렉토리를 지정해야 하는데요.

디렉토리의 이름은 log라고 하겠습니다.


로그 디렉토리를 만들기 위해, fs모듈이 필요하구요. 

existsSync메소드를 사용해서, 

log파일들을 모아놓을 log디렉토리가 없으면 만들도록 하겠습니다.

(물론 미리 디렉토리를 확실하게 미리 만들어 놓아도 무관합니다.)


디렉토리는 path.join을 사용하여, 

위에서 생성한 디렉토리를 사용하도록 하겠습니다.


const fs = require('fs');

const path = require('path');

const logDir = 'log';


if (!fs.existsSync(logDir)) fs.mkdirSync(logDir);

const logFilename = path.join(__dirname, '/../', logDir, '/created-logfile.log');


이제 transports에 대해서 정의해 보겠습니다.

<3. logger생성>에서 정의한 Console이외에, file에 대해서도 추가해 볼텐데요.


transport대상에 대해 정의할 때, 사용할 수 있는 여러가지 propery들이 있는데, 사용해 보겠습니다.

name은 file을 두번 사용하는 경우와 같이 중복으로 사용할 때, 구분자로서 역할을 하구요.

json형식으로 출력하고자 할 때는, json, 

최대 파일사이즈와 최대 파일수를 지정할 수 있는, maxsize, maxFiles도 있습니다.


그리고 가장 중요한 filename인데요.

이 부분에서 잘못 지정하면 로깅파일이 생성되지 않습니다.

디렉토리와 파일명을 정확하게 지정해주어야 합니다.



이제 이렇게 정의한 transports값을 넣어주기만 하면 됩니다.


let logger = new (winston.Logger)({ transports: transports });



5. 일자별로 Log파일 만들기


일자별로 매일 logging을 하고자 할 수도 있는데요.

이 때는, 모듈이 하나 더 필요합니다. winston-daily-rotate-file 인데요. 


먼저 모듈을 설치해 주겠습니다.


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


transport값에 들어가는 property는,

filename, datePattern 등이 있습니다.

역시 가장 중요한 것은 filename이 되겠네요.


let transport = new (winston.transports.DailyRotateFile)({

    filename: logFilename,

    datePattern: 'yyyy-MM-dd',

    prepend: true

});



datePattern은 위에서 기술한 것이외에도 추가적으로 사용할 수 있는데요.

아래와 같습니다.


(https://github.com/winstonjs/winston-daily-rotate-file)

+ Recent posts