서버(Server)/Server&Nodejs&DB

Nodejs : 로그파일, Winston Logger 사용하기

3DMP 2018. 4. 30. 22:09


옵션 중에 로그 파일이름에 날짜를 붙일 수도 있다


1
2
3
var winston = require('winston');   //로그파일
var winstonDaily = require('winston-daily-rotate-file');  //매일 다른 파일 로그를 생성하는 모듈
var moment = require('moment');     //날짜






로그를 남기는건 중요하다.

데이터는 곧 힘이 된다. 사람들이 무엇을 원하는지 알면 그들이 원하는 걸 주고 내가 원하는 걸 받을 수 있다.

데이터를 쌓는데 가장 핵심적인 일 중 하나가 로그를 꼼꼼히 남기는 일이다.

node기반의 logging라이브러리는 다양하지만 꽤 오래전부터 winston이라는 라이브러리가 패권을 잡고있다.

오늘은 winston에 대해 알아보자.

프로젝트를 생성하고 winston을 npm으로 설치한다.

npm install --save winston

임포트해보자.

기본 설정


var winston = require('winston');

var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)()
    ]
  });

그냥 바로 사용해도 되지만 편의상 logger를 만들어서 사용했다.

사실 벌써 끝난거나 다름없다.

logger.debug('디버그 로깅');
logger.info('인포 로깅');
logger.error('에러 로깅');

이런식으로 사용하면 로그가 출력된다.

사실 winston에서 가장 중요한건 transports라고 할 수 있는데, 형식을 정하거나 할 수 있다.

나는 로그를 file로 관리하고, 날짜별로 관리한다면 그것도 가능하다.

우선 타임스탬프부터 찍어보자.

나는 날짜별로 관리하기때문에 시간만 찍어보았다.

타임스탬프 찍기


const winston = require('winston');
const tsFormat = () => (new Date()).toLocaleTimeString();
const logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({
      timestamp: tsFormat
    })
  ]
});

logger.info('Hello world');

로그레벨은 기본적으로 5가지가 있다.

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

때에 맞춰 사용하면 더 식별하기 쉬운 로그가 된다.

커스텀도 가능하지만 그건 다루지 않을거고 Winston 공식문서를 참조하자.

파일로 로그 관리하기


먼저 파일로 로그를 관리하기 위해 파일시스템 라이브러리 fs를 설치한다.

npm install --save fs

풀 코드는 이렇다.

const winston = require('winston');
const fs = require('fs');
const logDir = 'log';

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

const tsFormat = () => (new Date()).toLocaleTimeString();
const logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({
      timestamp: tsFormat,
      level: 'info'
    }),
    new (winston.transports.File)({
      level: 'info',
      filename: `${logDir}/logs.log`,
      timestamp: tsFormat,
      maxsize:1000000,
      maxFiles:5
    })
  ]
});

로그 디렉토리가 없으면 생성하고 그 아래 로그파일들을 적재하는 코드다.

maxSize를 넘어가면 새로운 파일이 생기고, maxFiles만큼만 생성된다.

logs.log 다음은 logs1.log이런식으로 생성된다.

날짜별로 로그 파일관리하기


원래는 winston안에 daily-rotate-file이 함께 있었는데, 어떤이유에서인지 분리되어 나왔다.

winston-daily-rotate-file을 설치하자

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

풀 소스는 이렇다.

var winston = require('winston');
require('date-utils');
const fs = require('fs');
const logDir = 'log';

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

const tsFormat = () => (new Date()).toLocaleTimeString();

var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({
       timestamp: tsFormat,
       colorize: true,
       level: 'info'
     }),
      new (require('winston-daily-rotate-file'))({
        level: 'info',
        filename: `${logDir}/-logs.log`,
        timestamp: tsFormat,
        datePattern: 'yyyy-MM-dd',
        prepend: true,
      })
    ]
  });

이렇게하면 2017-03-03-logs.log라는 파일에 오늘치 로그가 쌓이게 된다.

winston으로 로그관리를 간단히 할 수 있게됬다. 



ref : https://isme2n.github.io/devlog/2017/03/03/Winston-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/

반응형