그런데 이렇게 했을 때 시간의 아래와 같은 형태로 찍힌다.
'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();
};
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');
}
노파심으로 말하자면, 물론 익명함수로도 가능하다.
winston.add(winston.transports.File, { filename: '2014-03-20.log', timestamp: function() { return moment().format('hh:mm:ss.SSS'); }, json: false });
'Programing > Node.js' 카테고리의 다른 글
An Introduction to libuv (0) | 2014.04.01 |
---|---|
libuv (0) | 2014.04.01 |
솔루션 파일 error MSB5014: 파일 형식 버전을 인식할 수 없습니다. (0) | 2014.01.08 |
[Node.js] SQL Server native 연결 (0) | 2013.11.26 |
[Node.js] Add on, Buffer 객체 C++로 넘기기 (0) | 2013.11.19 |