로그를 처리할 마이크로서비스가 준비되었습니다. 이제 모든 마이크로서비스의 부모 클래스를 수정해 로그 관리 마이크로서비스에 API 요청 로그를 남기도록 합니다.
코드 12-2 Server 클래스 로그 처리 기능 추가
예제 파일 : server.js
class tcpServer { constructor(name, port, urls) { this.logTcpClient = null; // ➊ 그 관리 마이크로서비스 연결 클라이언트 ...... socket.on('data', (data) => { var key = socket.remoteAddress + ":" + socket.remotePort; var sz = this.merge[key] ? this.merge[key] + data.toString() : data.toString(); var arr = sz.split('¶'); for (var n in arr) { if (sz.charAt(sz.length - 1) != '¶' && n == arr.length - 1) { this.merge[key] = arr[n]; break; } else if (arr[n] == "") { break; } else { this.writeLog(arr[n]); // ➋ equest 로그 this.onRead(socket, JSON.parse(arr[n])); } } }); }); ...... connectToDistributor(host, port, onNoti) { ...... this.clientDistributor = new tcpClient( host , port , (options) => { isConnectedDistributor = true; this.clientDistributor.write(packet); } , (options, data) => { // ➌ 그 관리 마이크로서비스 연결 if (this.logTcpClient == null && this.context.name != 'logs') { for (var n in data.params) { const ms = data.params[n]; if (ms.name == 'logs') { this.connectToLog(ms.host, ms.port); break; } } } onNoti(data); } // Distributor 데이터 수신 이벤트 // Distributor 접속 종료 이벤트 , (options) => { isConnectedDistributor = false; } // Distributor 통신 에러 이벤트 , (options) => { isConnectedDistributor = false; } ); ...... } connectToLog(host, port) { // ➍ 그 관리 마이크로서비스 연결 this.logTcpClient = new tcpClient( host , port , (options) => {} , (options) => { this.logTcpClient = null; } , (options) => { this.logTcpClient = null; } ); this.logTcpClient.connect(); } writeLog(log) { // ➎ 그 패킷 전달 if (this.logTcpClient) { const packet = { uri: "/logs", method: "POST", key: 0, params: log }; this.logTcpClient.write(packet); } else { console.log(log); } } } module.exports = tcpServer;
로그 관리 마이크로서비스 연결용 tcpClient 변수를 선언합니다(➊). API가 호출되면 자식 프로세스에 전달하기 전에 먼저 로그 관리 마이크로서비스로 로그를 전달합니다. 이때 아직 로그 관리 마이크로서비스가 준비되지 않았으면 화면에 로그를 출력합니다(➋, ➎). Distributor에서 로그 관리 마이크로서비스가 접속했다는 정보를 받으면 접속 정보를 이용해 로그 관리 마이크로서비스로 접속을 시도합니다(➌, ➍).