반응형
Node.js로 마스터 / 슬레이브 서버를 구축했을때 가장 큰 문제는 어느 서버에 어떤 이벤트가 발생했는가 였다.
처음엔 그냥 console.log로 처리를 했는데 이게 하다보니까 좀 무식한 방법이였다.
마스터 서버 로그같은건
console.log('마스터 서버: ', message);
뭐 이런 식으로 처리를 했기 때문에... 좀 무식했다.
그래서 자바나 C# 때처럼 로깅 레벨도 있는 스마트한 로거가 있었으면 해서 찾아봤다.
1. 모듈 선언 (npm install은 기본)
(갑자기!) 모듈 선언을 해준다.
// fs
const fs = require('fs');
const path = require('path');
const logDir = 'logs';
if (!fs.existsSync(logDir))
fs.mkdirSync(logDir);
// Winston
var winston = require('winston');
var moment = require('moment-timezone');
2. 모듈에서 필요한 함수 꺼내기
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, label, printf } = format;
const log_format = printf(({ level, message, label, timestamp }) => {
return `[${level}] ${timestamp} | ${label}: ${message}`;
});
const appendTimestamp = format((info, opts) => {
if(opts.tz)
info.timestamp = moment().tz(opts.tz).format();
return info;
});
3. 마스터 / 슬레이브용 로거 반환하기
module.exports.createMasterLogger = () => {
return winston.createLogger({
format: combine(
label({ label: '마스터 서버' }),
appendTimestamp({ tz: 'Asia/Seoul' }),
log_format
),
transports: [
new winston.transports.Console({ level: 'info', colorize: true }),
new winston.transports.File({ level: 'info', filename: './logs/master.log' }),
new winston.transports.File({ level: 'debug', filename: './logs/master_debug.log' })
]
});
}
module.exports.createSlaveLogger = (slave_num) => {
return winston.createLogger({
format: combine(
label({ label: '슬레이브 서버 [' + slave_num + ']' }),
appendTimestamp({ tz: 'Asia/Seoul' }),
log_format
),
transports: [
new winston.transports.Console({ level: 'info', colorize: true }),
new winston.transports.File({ level: 'info', filename: './logs/slave-' + slave_num + '.log' }),
new winston.transports.File({ level: 'debug', filename: './logs/slave-' + slave_num + '_debug.log' })
]
});
};
대충 이런식으로 로그를 콘솔에도 띄우고 파일에도 기록해준다.
끗.
영어만 알면 너무 직관적이라 설명은 필요 없을 것 같다.
사실 Winston 자료를 찾다보면 이게 버전별로 너무 중구난방이라.. 결국 이걸 어디서 찾아왔는진 기억이 안난다.
그래도 뭐 내가 수정한 부분도 있고 하니 출처는 없는 걸로 (띠용!)
반응형
'Node.js' 카테고리의 다른 글
[Node.js / Javascript] Readline 모듈로 서버 관리 콘솔 만들기 (0) | 2019.06.01 |
---|---|
[Node.js / Javascript] Socket.IO 사용시 로드밸런서(리버스 프록시)에서 넘어오는 진짜 IP 얻기 (0) | 2019.06.01 |
[Node.js / Javascript] Socket.IO와 HTTP 서버를 같은 포트에서 Listen하기 (0) | 2019.06.01 |
[Node.js / Javascript] Async 모듈로 비동기 함수들 교통 정리 해주기 (0) | 2019.06.01 |
[Node.js / Javascript] RPC로 서버 관리(종료)하기 (0) | 2019.06.01 |