-
[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'
파일을 훑어보면 아래 코드를 확인 할 수 있다.
계속 따라가보자.
winston -> logform
logform -> timestamp
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' }
'Backend > NodeJS' 카테고리의 다른 글
[node] nodemailer를 이용해 메일 전송 하기 (0) 2020.04.13 [winston] How to log as daily rotate file (0) 2019.12.20 How to use Winston to log node application with telegram. (0) 2019.12.19 [node] express compression 메모리 최적화 (memory optimization) (0) 2019.12.18 ReferenceError: regeneratorRuntime is not defined (0) 2019.12.09