Explorar o código

update logging format

HANTE hai 1 día
pai
achega
960e24a686

+ 5 - 0
src/main/java/com/tsi/comm/server/mybatis/TsiDatabaseService.java

@@ -100,6 +100,11 @@ public class TsiDatabaseService {
             node.setIdx(idx++);  // 인덱스 설정
             //int hash = Long.hashCode(obj.getNodeId()); // 해시코드 생성, 필요시 사용
             //int idx = Math.abs(hash % 9);
+
+            final String ipAddr = obj.getIpAddr();
+            if (!"0.0.0.0".equals(ipAddr)) {
+                this.nodeManager.putIpAddr(ipAddr, node);
+            }
         }
 
         this.nodeManager.afterLoading();

+ 73 - 0
src/main/java/com/tsi/comm/server/process/packet/TsiChannelSession.java

@@ -0,0 +1,73 @@
+package com.tsi.comm.server.process.packet;
+
+import com.tsi.comm.server.vo.TsiNodeVo;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+
+@Slf4j
+public class TsiChannelSession {
+
+    private TsiChannelSession() {
+        // Private constructor to prevent instantiation
+    }
+
+    public static void sessionActive(TsiNodeVo nodeVo, String remoteIpAddress) {
+        try {
+            if (nodeVo != null) {
+                final String logKey = nodeVo.getKey();
+                MDC.put("id", logKey);
+                log.info("Node: {}, ---Connect, Connects: {}, {}", nodeVo.getNodeId(), nodeVo.getConnectCount().get(), remoteIpAddress);
+                MDC.remove(logKey);
+                MDC.clear();
+            }
+        }
+        catch (Exception e) {
+            // Log the exception with a meaningful message
+        }
+    }
+
+    public static void sessionInactive(TsiNodeVo nodeVo, String remoteIpAddress) {
+        try {
+            if (nodeVo != null) {
+                final String logKey = nodeVo.getKey();
+                MDC.put("id", logKey);
+                log.info("Node: {}, Disconnect, Connects: {}, {}", nodeVo.getNodeId(), nodeVo.getConnectCount().get(), remoteIpAddress);
+                MDC.remove(logKey);
+                MDC.clear();
+            }
+        }
+        catch (Exception e) {
+            // Log the exception with a meaningful message
+        }
+    }
+
+    public static void objectRegistered(TsiNodeVo nodeVo, String remoteIpAddress) {
+        try {
+            if (nodeVo != null) {
+                final String logKey = nodeVo.getKey();
+                MDC.put("id", logKey);
+                log.info("Node: {}, Registered, Connects: {}, {}", nodeVo.getNodeId(), nodeVo.getConnectCount().get(), remoteIpAddress);
+                MDC.remove(logKey);
+                MDC.clear();
+            }
+        }
+        catch (Exception e) {
+            // Log the exception with a meaningful message
+        }
+    }
+
+    public static void sessionTimeout(TsiNodeVo nodeVo, String remoteIpAddress) {
+        try {
+            if (nodeVo != null) {
+                final String logKey = nodeVo.getKey();
+                MDC.put("id", logKey);
+                log.info("Node: {}, RcvTimeout, Connects: {}, {}", nodeVo.getNodeId(), nodeVo.getConnectCount().get(), remoteIpAddress);
+                MDC.remove(logKey);
+                MDC.clear();
+            }
+        }
+        catch (Exception e) {
+            // Log the exception with a meaningful message
+        }
+    }
+}

+ 7 - 3
src/main/java/com/tsi/comm/server/process/packet/TsiCvimPacketWorker.java

@@ -175,7 +175,9 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
                         this.loggingService.add(packet, loggingIdx);//(int)Thread.currentThread().getId());
                     }
                 } catch (Exception e) {
-                    log.error("Disconnect Packet parsing error: {}, {}, {}", nodeId, Thread.currentThread().getName(), e.getMessage());
+                    if (nodeVo.isConnect()) {
+                        log.warn("Node: {}, Disconnect parsing error: {}, connect: {}", nodeId, Thread.currentThread().getName(), nodeVo.isConnect());
+                    }
                 }
                 return;
             }
@@ -188,7 +190,7 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
                 if (0 != result) {
                     byte[] buf = cpuPacket.getBuf();
                     int reqLength = TsiCpuPacket.SIZE_PACKET_DATA + (TsiCpuPacket.SIZE_STATUS_DATA * cpuPacket.getCount());
-                    log.error("Node: {}, Packet parsing failed.", nodeId);
+                    log.error("Node: {}, CPU Packet parsing failed. error: {}.", nodeId, result);
                     log.error("{}", HexString.fromBytes(buf));
                     switch (result) {
                         case -1:
@@ -208,7 +210,9 @@ public class TsiCvimPacketWorker extends AbstractTsiCvimWorker implements Runnab
                     }
                 }
             } catch (Exception e) {
-                log.error("Cpu Packet parsing error: {}, {}, {}", nodeId, Thread.currentThread().getName(), e.getMessage());
+                if (nodeVo.isConnect()) {
+                    log.warn("Node: {}, CPU Packet parsing error: {}, connect: {}", nodeId, Thread.currentThread().getName(), nodeVo.isConnect());
+                }
             }
 
             packet.setPar(System.nanoTime());

+ 18 - 0
src/main/java/com/tsi/comm/server/repository/TsiNodeManager.java

@@ -16,6 +16,7 @@ import java.util.concurrent.ConcurrentHashMap;
 public class TsiNodeManager {
 
     private final ConcurrentHashMap<Long, TsiNodeVo> tsiNodeVoMap = new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<String, TsiNodeVo> ipAddrMap = new ConcurrentHashMap<>();
 
     public TsiNodeVo get(long nodeId) {
         return this.tsiNodeVoMap.get(nodeId);
@@ -28,6 +29,23 @@ public class TsiNodeManager {
         return this.tsiNodeVoMap.size();
     }
 
+    public TsiNodeVo getIpAddr(String ipAddr) {
+        if (ipAddr == null || ipAddr.isEmpty()) {
+            return null;
+        }
+        return this.ipAddrMap.get(ipAddr);
+    }
+    public void putIpAddr(String ipAddr, TsiNodeVo vo) {
+        if (ipAddr == null || ipAddr.isEmpty()) {
+            return;
+        }
+        this.ipAddrMap.put(ipAddr, vo);
+    }
+
+    public int sizeIpAddr() {
+        return this.ipAddrMap.size();
+    }
+
     public boolean containsKey(long key) {
         return this.tsiNodeVoMap.containsKey(key);
     }

+ 26 - 11
src/main/java/com/tsi/comm/server/repository/TsiReportManager.java

@@ -9,6 +9,7 @@ import com.tsi.comm.server.process.dbms.TsiCvimDbmsProcess;
 import com.tsi.comm.server.process.dbms.TsiCvimDbmsWorker;
 import com.tsi.comm.server.process.logging.TsiCvimLoggingProcess;
 import com.tsi.comm.server.process.logging.TsiCvimLoggingWorker;
+import com.tsi.comm.server.process.packet.TsiChannelSession;
 import com.tsi.comm.server.process.packet.TsiCvimPacketProcess;
 import com.tsi.comm.server.process.packet.TsiCvimPacketWorker;
 import com.tsi.comm.server.vo.TsiAlarmConfigVo;
@@ -153,6 +154,8 @@ public class TsiReportManager {
                         log.info("Recv Timeout: Node: {}, Connect: {}, LastCommTime: {}, timeout: {}",
                                 node.getKey(), connectTm, lastCommTm, timeout);
 
+                        TsiChannelSession.sessionTimeout(node, NettyUtils.getRemoteIpAddress(node.getChannel()));
+
                         node.getChannel().disconnect();
                         node.getChannel().close();
                     }
@@ -171,60 +174,72 @@ public class TsiReportManager {
         final String fileName = "queue";
         MDC.put("report", fileName);
 
+        boolean isTail = false;
         int remainingCapacity = 0;
 
-        log.info("================================================================================================================");
-        log.info("Worker Queue Information.");
+        if (!isAlert) {
+            log.info("================================================================================================================");
+            log.info("Worker Queue Information.");
+        }
         List<AbstractTsiCvimWorker> processWorkerList = this.packetProcess.getWorkerList();
         remainingCapacity = isAlert ? 100 : this.packetProcess.getQSize();
-        log.info("----- Packet Worker: {} EA, QSize: {} EA.", processWorkerList.size(), this.packetProcess.getQSize());
+        if (!isAlert) {
+            log.info("-----  Packet Worker: {} EA, QSize: {} EA.", processWorkerList.size(), this.packetProcess.getQSize());
+        }
         List<TsiCvimPacketWorker> packetWorkers = processWorkerList.stream()
                 .filter(worker -> worker instanceof TsiCvimPacketWorker)
                 .map(worker -> (TsiCvimPacketWorker) worker)
                 .collect(Collectors.toList());
         for (TsiCvimPacketWorker worker : packetWorkers) {
             if (worker.getDATA_QUEUE().remainingCapacity() <= remainingCapacity) {
-                log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
+                log.info("PacketWorker({}), Total/Size/Remain: {}/{}/{}, Average: {}",
                         worker.getIdx(),
                         worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
                         TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+                isTail = true;
             }
         }
 
         List<AbstractTsiCvimWorker> dbmsWorkerList = this.dbmsProcess.getWorkerList();
         remainingCapacity = isAlert ? 100 : this.dbmsProcess.getQSize();
-        log.info("----- Dbms Worker: {} EA, QSize: {} EA.", dbmsWorkerList.size(), this.dbmsProcess.getQSize());
+        if (!isAlert) {
+            log.info("-----    Dbms Worker: {} EA, QSize: {} EA.", dbmsWorkerList.size(), this.dbmsProcess.getQSize());
+        }
         List<TsiCvimDbmsWorker> dbmsWorkers = dbmsWorkerList.stream()
                 .filter(worker -> worker instanceof TsiCvimDbmsWorker)
                 .map(worker -> (TsiCvimDbmsWorker) worker)
                 .collect(Collectors.toList());
         for (TsiCvimDbmsWorker worker : dbmsWorkers) {
             if (worker.getDATA_QUEUE().remainingCapacity() <= remainingCapacity) {
-                log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
+                log.info("DbmsWorker({}), Total/Size/Remain: {}/{}/{}, Average: {}",
                         worker.getIdx(),
                         worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
                         TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+                isTail = true;
             }
         }
 
         List<AbstractTsiCvimWorker> loggingWorkerList = this.loggingProcess.getWorkerList();
         remainingCapacity = isAlert ? 100 : this.loggingProcess.getQSize();
-        log.info("----- Logging Worker: {} EA, QSize: {} EA.", loggingWorkerList.size(), this.loggingProcess.getQSize());
+        if (!isAlert) {
+            log.info("----- Logging Worker: {} EA, QSize: {} EA.", loggingWorkerList.size(), this.loggingProcess.getQSize());
+        }
         List<TsiCvimLoggingWorker> loggingWorkers = loggingWorkerList.stream()
                 .filter(worker -> worker instanceof TsiCvimLoggingWorker)
                 .map(worker -> (TsiCvimLoggingWorker) worker)
                 .collect(Collectors.toList());
         for (TsiCvimLoggingWorker worker : loggingWorkers) {
             if (worker.getDATA_QUEUE().remainingCapacity() <= remainingCapacity) {
-                log.info("{}, Total/Size/Remain: {}/{}/{}, Average: {}",
+                log.info("LoggingWorker({}), Total/Size/Remain: {}/{}/{}, Average: {}",
                         worker.getIdx(),
                         worker.getQSize(), worker.getDATA_QUEUE().size(), worker.getDATA_QUEUE().remainingCapacity(),
                         TimeUtils.elapsedTimeStr(worker.getAvgTime()));
+                isTail = true;
             }
         }
-        log.info("----------------------------------------------------------------------------------------------------------------");
-        log.info("================================================================================================================");
-
+        if (isTail) {
+            log.info("================================================================================================================");
+        }
         MDC.remove(fileName);
         MDC.clear();
     }

+ 9 - 11
src/main/java/com/tsi/comm/server/tcp/codec/CvimServerByteBufMessageDecoder.java

@@ -9,6 +9,7 @@ import com.tsi.comm.server.mybatis.vo.AlarmOccrVo;
 import com.tsi.comm.server.mybatis.vo.NodeIpAddrVo;
 import com.tsi.comm.server.mybatis.vo.NodeStatusVo;
 import com.tsi.comm.server.process.dbms.TsiCvimDbmsProcess;
+import com.tsi.comm.server.process.packet.TsiChannelSession;
 import com.tsi.comm.server.process.packet.TsiCvimPacketProcess;
 import com.tsi.comm.server.protocol.TsiCpuPacket;
 import com.tsi.comm.server.repository.TsiAlarmManager;
@@ -106,6 +107,7 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
                 nodeIpAddrVo.setNodeId(nodeVo.getNodeId());
                 nodeIpAddrVo.setIpAddr(remoteIpAddress);
                 this.dbmsProcess.add(nodeIpAddrVo, (int)Thread.currentThread().getId());
+                this.nodeManager.putIpAddr(remoteIpAddress, nodeVo); // IP 주소 갱신
             }
 
             TsiCpuPacket packet = new TsiCpuPacket(nodeId, msec, nsec, ctx.channel());
@@ -124,10 +126,6 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
             if (nodeVo.isDump()) {
                 log.info("RECV: {}, {}", nodeVo.getNodeId(), SysUtils.byteArrayToHex(packet.getBuf()));
             }
-//            if (nodeId <= 0) {
-//                // logging
-//                this.alarmManager.loggingUnknownNodePacket(nodeId, ctx.channel(), packet);
-//            }
         }
         catch (Exception e) {
             log.error("decode Exception: {}", e.getMessage());
@@ -140,19 +138,19 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
         // 노드맵에서 노드 정보를 찾는다.
         TsiNodeVo nodeVo = this.nodeManager.get(nodeId);
         if (nodeVo == null) {
-            // 메모리맵에 노드정보가 존재하지 않은 경우
-            // 원래는 종료 시켜야 하나.....
-            // 신규로 해당 노드정보 메로리를 생성해서 메모리 맵에 추가한다.
-
+            // 메모리맵에 노드정보가 존재하지 않은 경우 로깅
             this.alarmManager.loggingUnknownNode(nodeId, channel);
-//            log.warn("The node ID of the first received packet is not registered..: {}, {}", nodeId, channel);
             if (nodeId <= 0) {
                 return null; // 잘못된 노드 ID인 경우 null 반환
             }
+
+            // 등록되어 있지 않은 노드 ID로 접속한 경우(노드 ID가 0 이하인 경우 제외)
+            // 신규로 해당 노드정보 메모리를 생성해서 메모리 맵에 추가한다.
             nodeVo = new TsiNodeVo(nodeId, remoteIpAddress, false, true, true);
             nodeVo.setCheckInstalled(true);
             nodeVo.setRegistered(false);
             this.nodeManager.put(nodeId, nodeVo);
+            this.nodeManager.putIpAddr(remoteIpAddress, nodeVo); // IP 주소 갱신
 
             // oops 알람 설정 되어 있으면 알람테이블에 저장하자.
             if (this.alarmManager.checkAlarm(TsiAlarmConfigVo.COMM_01)) {
@@ -169,8 +167,8 @@ public class CvimServerByteBufMessageDecoder extends MessageToMessageDecoder<Byt
 
         // 채널 맵에 채널에 대한 노드정보를 저장한다.
         this.sessionManager.addChannel(channel, nodeVo);
-
-        log.info("Node Object Register, Node: {}: {}, {}", nodeId, TimeUtils.elapsedTime(start), Thread.currentThread().getId());
+        TsiChannelSession.objectRegistered(nodeVo, remoteIpAddress);
+//        log.info("Node: {}, Object Register: {}, {}", nodeId, TimeUtils.elapsedTime(start), Thread.currentThread().getId());
         return nodeVo;
     }
 

+ 15 - 2
src/main/java/com/tsi/comm/server/tcp/handler/CvimServerInboundMessageHandler.java

@@ -6,10 +6,12 @@ import com.tsi.comm.server.mybatis.vo.AbstractDbmsVo;
 import com.tsi.comm.server.mybatis.vo.AlarmOccrVo;
 import com.tsi.comm.server.mybatis.vo.NodeStatusVo;
 import com.tsi.comm.server.process.dbms.TsiCvimDbmsProcess;
+import com.tsi.comm.server.process.packet.TsiChannelSession;
 import com.tsi.comm.server.process.packet.TsiCvimPacketProcess;
 import com.tsi.comm.server.protocol.AbstractTsiPacket;
 import com.tsi.comm.server.protocol.TsiCpuDisconnected;
 import com.tsi.comm.server.repository.TsiAlarmManager;
+import com.tsi.comm.server.repository.TsiNodeManager;
 import com.tsi.comm.server.repository.TsiSessionManager;
 import com.tsi.comm.server.vo.TsiAlarmConfigVo;
 import com.tsi.comm.server.vo.TsiNodeVo;
@@ -29,6 +31,7 @@ import org.springframework.stereotype.Component;
 public class CvimServerInboundMessageHandler extends ChannelInboundHandlerAdapter {
 
     private final TsiCvimServerConfig config;
+    private final TsiNodeManager nodeManager;
     private final TsiSessionManager sessionManager;
     private final TsiAlarmManager alarmManager;
     private final TsiCvimPacketProcess packetProcess;
@@ -51,12 +54,18 @@ public class CvimServerInboundMessageHandler extends ChannelInboundHandlerAdapte
         int sessions = this.sessionManager.add();
         // IP Address 로 제어기를 판달할 수 있으면 여기서 제어기 등록 여부를 판단해서
         // 접속 여부를 처리할 수 있다.
-        log.info("{}.++channelActive: {}, {} Sessions.", this.getClass().getSimpleName(), NettyUtils.getAddress(ctx.channel()), sessions);
+        final String remoteIpAddr = NettyUtils.getRemoteIpAddress(ctx.channel());
+        log.info("--channelActive: {}, {} Sessions.", remoteIpAddr, sessions);
+        TsiNodeVo ipNodeVo = this.nodeManager.getIpAddr(remoteIpAddr);
+        if (ipNodeVo != null) {
+            TsiChannelSession.sessionActive(ipNodeVo, remoteIpAddr);
+        }
         ctx.fireChannelActive();
     }
 
     @Override
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+        final String remoteIpAddr = NettyUtils.getRemoteIpAddress(ctx.channel());
         TsiNodeVo nodeVo = this.sessionManager.getNodeVo(ctx.channel());
         if (nodeVo != null) {
             nodeVo.setConnect(null);
@@ -86,7 +95,11 @@ public class CvimServerInboundMessageHandler extends ChannelInboundHandlerAdapte
 
         // session count decrement
         int sessions = this.sessionManager.remove();
-        log.info("{}.channelInactive: {}, {} Sessions.", this.getClass().getSimpleName(), NettyUtils.getAddress(ctx.channel()), sessions);
+        log.info("channelInactive: {}, {} Sessions.", remoteIpAddr, sessions);
+        TsiNodeVo ipNodeVo = this.nodeManager.getIpAddr(remoteIpAddr);
+        if (ipNodeVo != null) {
+            TsiChannelSession.sessionInactive(ipNodeVo, remoteIpAddr);
+        }
         ctx.fireChannelInactive();
     }
 

+ 1 - 0
src/main/resources/logback-spring.xml

@@ -105,6 +105,7 @@
     </logger>
 
     <root level="INFO">
+<!--        <appender-ref ref="CONSOLE"/>-->
         <appender-ref ref="FILE_LOG"/>
         <appender-ref ref="FILE_ERROR"/>
     </root>

+ 2 - 2
src/main/resources/mybatis/mapper/tsi-comm-server.xml

@@ -19,8 +19,8 @@
 
     <select id="getNodeInfoList" parameterType="java.util.HashMap" resultType="com.tsi.comm.server.mybatis.vo.NodeVo">
         <![CDATA[
-        select a.nodeid, nvl(trim(a.ipaddr), '0'),
-               useyn, cvimyn, nodeyn, testyn
+        select a.nodeid as nodeId, nvl(trim(a.ipaddr), '0.0.0.0') as ipAddr,
+               useyn as useYn, cvimyn as cvimYn, nodeyn as nodeYn, testyn as testYn
         from tb_tsc_node a
         where a.useyn  = 'Y'
         ]]>