ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [winston] How to customize timestamp format. (to local timezone) 날짜 시간 포맷을 로컬 타임존으로 변경하기
    Backend/NodeJS 2019. 12. 20. 16:17

    Winston에서 날짜 시간 포맷을 로컬 타임존으로 변경 하기!

     

     

    나의 node.js 프로젝트에 winston을 적용하는 과정에서

    로그 메시지의 시간을 기록하는데 timezone이 utc 기준 시간으로 기록이 되었다.

    그래서 timestamp를 커스터마이징을 했다.

     


    winston 깃허브에서 사용 예를 보면 아래와 같다.

    timestamp 타임존이 로컬 기준이 아니라 시간이 맞지 않는다.

    // 원본 소스
    const { format } = require('winston');
    const { combine, timestamp, label, prettyPrint } = format;
    
    const logger = createLogger({
      format: combine(
        label({ label: 'right meow!' }),
        timestamp(),
        prettyPrint()
      ),
      transports: [new transports.Console()]
    })
    
    logger.log({
      level: 'info',
      message: 'What time is the testing at?'
    });
    // Outputs:
    // { level: 'info',
    //   message: 'What time is the testing at?',
    //   label: 'right meow!',
    //   timestamp: '2017-09-30T03:57:26.875Z' }

     

    이유는 아래 경로를 따라 탐색해보면 알 수 있다.

    'node_modules/winston/lib/winston.js'

    파일을 훑어보면 아래 코드를 확인 할 수 있다.

    node_modules/winston/lib/ winston.js

    계속 따라가보자.

    winston -> logform

    node_modules/logform/index.d.ts

    logform -> timestamp

    logform 라이브러리 폴더에서 timestamp.js 파일을 찾을 수 있다.

    node_modules/logform/ timestamp.js

     

    위의 코드의 18, 22 라인을 보면, Date() 값을 그대로 반환하는 것을 확인 할 수 있다.

    // line 18
    : fecha.format(new Date(), opts.format);
    // line 22
    info.timestamp = new Date().toISOString();

     

    이제 거의 다 왔다. 

    위의 라이브러리 파일에서 코드만 살짝 수정하면 해결된다.

    하지만 서버에 배포를 하게되면 일일이 찾아서 다 수정해 줘야하는 문제가 발생하기 때문에

    그렇게 하지 않고 커스텀한다.

     


     

    Lets customize!

     

    먼저 fecha 라이브러리를 설치해준다.

    $ npm install fecha --save ($ yum add fecha)

     

    그리고  아래와 같이 커스텀한다.

    const timestamp = format((info: any, opts: any = {}) => {
      if (opts.format) {
        info.timestamp = typeof opts.format === "function"
          ? opts.format()
          : fecha.format(moment(), opts.format);
      }
    
      if (!info.timestamp) {
        info.timestamp = moment().format().replace(/T/, " ").replace(/\+.+/, "");
      }
    
      if (opts.alias) {
        info[opts.alias] = info.timestamp;
      }
    
      return info;
    });

     

    결과 소스 코드

    // logger.js
    import moment from "moment";
    const fecha = require("fecha");
    const winston = require("winston");
    const format = winston.format;
    const { combine, timestamp, label, prettyPrint } = format;
    
    const timestamp = format((info: any, opts: any = {}) => {
      if (opts.format) {
        info.timestamp = typeof opts.format === "function"
          ? opts.format()
          : fecha.format(moment(), opts.format);
      }
    
      if (!info.timestamp) {
        info.timestamp = moment().format().replace(/T/, " ").replace(/\+.+/, "");
      }
    
      if (opts.alias) {
        info[opts.alias] = info.timestamp;
      }
    
      return info;
    });
    
    const logger = createLogger({
      format: combine(
        label({ label: 'right meow!' }),
        timestamp(),
        prettyPrint()
      ),
      transports: [new transports.Console()]
    })
    
    logger.log({
      level: 'info',
      message: 'What time is the testing at?'
    });
    // Outputs:
    // { level: 'info',
    //   message: 'What time is the testing at?',
    //   label: 'right meow!',
    //   timestamp: '2019-12-20 15:47:05' }

     

     

     

     

     

     

     

     

    댓글

Designed by Tistory.