본문 바로가기

Programing/Node.js

Node.js winston 표준 시간이 안맞는 경우 해결 방법

winstone의 날짜는 winston.transports설정시 timestamp 프로퍼티를 이용하여 설정할 수 있다.
var winston = require('winston');
winston.add(winston.transports.File, { filename: '2014-03-20.log', timestamp: true, json: false });


그런데 이렇게 했을 때 시간의 아래와 같은 형태로 찍힌다.

'2014-03-20T08:26:15.861Z'

그런데 이 시간은 UTC이기 때문에 지역시간과 다를 수 있다. KST를 사용하는 한국에서는 -9 한 값이 나온다.



winston의 기본 시간 표시는 whitelife님의 블로그를 보면 알 수 있듯이 node_modules/winston/lib/winston/common.js의 아랫 부분이 담당한다.

exports.timestamp = function () {

  return new Date().toISOString();

};


whitelife님의 블로그에서는 시간 수정을 위해 라이브러리 코드를 수정하라는 권장을 하였다.

하지만 라이브러리 소스코드를 수정하는 것은, 라이브러리가 갱신 되었을 때 다시 그 부분을 찾아 수정해야 하는 유지관리 부담이 생긴다.


가끔 내가 라이브러리를 만들 때 사용하는 사람이 확장을 해서 기본 기능을 바꿀 수 있는 수단을 제공을 한다. 그런데 사람은 내 라이브러리 소스를 달라고 해서 소스를 수정한다. 확장을 할 수 있는 API를 제공했음에도 말이다.


사용자가 자신의 timestamp를 만드는 방법은 간단하다. winston도 확장을 할 수 있는 방법을 제공해놓았기 때문이다.

log 함수를 보면 아래와 같다.

exports.log = function (options) {

  var timestampFn = typeof options.timestamp === 'function'

                  ? options.timestamp

                  : exports.timestamp,

      timestamp   = options.timestamp ? timestampFn() : null,

      meta        = options.meta !== undefined || options.meta !== null ? exports.clone(cycle.decycle(options.meta)) : null,

      output;

옵션으로 들어온 값이 timestamp의 타입이 함수인 경우는 함수를 실행하게 되어 있다. 그렇지 않을 경우에는 기본 타임스탬프 함수를 exports.timestamp를 사용하게 끔 분기가 되어 있다.


따라서 옵션에서 함수로 넘겨주면 그 값이 timestamp로 찍을 수 있는 것이다.

처음 예제를 수정해 보면,

function myTimeStamp () {

  return new Date().toString();

};

var winston = require('winston');
winston.add(winston.transports.File, { filename: '2014-03-20.log', timestamp: myTimeStamp, json: false });

true라는 값 대신에 함수를 지정해주었다.

그러면

'Thu Mar 20 2014 17:24:55 GMT+0900 (대한민국 표준시)'

와 같은 형식의 시간이 찍히게 된다.


나의 경우에는 날짜별로 로그 파일을 만들기 때문에 timestamp에 날짜없이 시분초.ms만 있으면 된다.

아래와 같은 형태이다.

04:30:52.008


직접 구현을 해볼까 했는데 moment라는 날짜 포맷을 쉽게 처리할 수 있는 라이브러리가 있어 이것을 사용했다.

var moment = require('moment');


function myTimeStamp() {

  return moment().format('hh:mm:ss.SSS');

}


노파심으로 말하자면, 물론 익명함수로도 가능하다.

var winston = require('winston');

winston.add(winston.transports.File, { filename: '2014-03-20.log', timestamp: function() { return moment().format('hh:mm:ss.SSS'); }, json: false });