Published on

Socket 서버 구현 3 (Logging)

1. Winston 모듈

  • winston 모듈을 사용하여 1일 기준으로 로그 파일이 로테이션 되도록 설정하였다.

  • 로그파일은 'control_2018-02-12.log' 와 같이 생성된다.

var winston = require('winston');

logger = new winston.Logger({
  transports: [
    new winston.transports.DailyRotateFile({
      filename: __dirname + '/../../logs/control_',
      datePattern: 'yyyy-MM-dd.log',
      level: 'debug',
      handleExceptions: true,
      json: false,
      colorize: true,
      maxFiles: 10,
      maxsize: 1 * 1024 * 1024 * 1024,
      timestamp: function () {
        var date = new Date();
        var tz = date.getTime() + date.getTimezoneOffset() * 60000 + 9 * 3600000;
        date.setTime(tz);

        var curr_hour = pad(date.getHours());
        var curr_min = pad(date.getMinutes());
        var curr_sec = pad(date.getSeconds());
        var curr_msec = pad2(date.getMilliseconds());

        return curr_hour + ':' + curr_min + ':' + curr_sec + '.' + curr_msec;
      },
      formatter: function (options) {
        return (
          '[' +
          options.timestamp() +
          ' ' +
          options.level.toUpperCase() +
          ']' +
          (undefined !== options.message ? options.message : '') +
          (options.meta && Object.keys(options.meta).length
            ? '\n\t' + JSON.stringify(options.meta)
            : '')
        );
      },
    }),
    new winston.transports.Console({
      level: 'debug',
      handleExceptions: true,
      json: false,
      colorize: true,
      timestamp: function () {
        var date = new Date();
        var tz = date.getTime() + date.getTimezoneOffset() * 60000 + 9 * 3600000;
        date.setTime(tz);

        var curr_hour = pad(date.getHours());
        var curr_min = pad(date.getMinutes());
        var curr_sec = pad(date.getSeconds());
        var curr_msec = pad2(date.getMilliseconds());

        return curr_hour + ':' + curr_min + ':' + curr_sec + '.' + curr_msec;
      },
      formatter: function (options) {
        return (
          '[' +
          options.timestamp() +
          ' ' +
          options.level.toUpperCase() +
          ']' +
          (undefined !== options.message ? options.message : '') +
          (options.meta && Object.keys(options.meta).length
            ? '\n\t' + JSON.stringify(options.meta)
            : '')
        );
      },
    }),
  ],
  exitOnError: false,
});

2. Master로 Log메시지 전송 및 Master의 Logging 관리

  • winston을 통하여 logging 파일을 생성하고, 기록하는 일은 Master Process 한 곳에서 관리한다.

  • Worker Process들 에서는 IPC 통신으로 Master에 Log메시지를 전송하고, Master에서 Log메시지를 받아 파일에 기록한다.

/** Master Process 코드 **/

var processLoggingMsg = function (message) {
  if (message && message.data) {
    switch (message.data.type) {
      case 'debug':
        logging.debugLog(message.data.log);
        break;
      case 'info':
        logging.infoLog(message.data.log);
        break;
      case 'warning':
        logging.warningLog(message.data.log);
        break;
      case 'error':
        logging.errorLog(message.data.log);
        break;
      default:
        break;
    }
  }
};

var masterMessageListener = function (message) {
  if (message && message.data) {
    switch (message.data.type) {
      case 'kafka':
        processKafkaMsg(message.data);
        break;
      case 'logging':
        processLoggingMsg(message.data);
        break;
      // ...
      // ...
      // ...
      default:
        break;
    }
  }
};

process.on('message', masterMessageListener);