diff --git a/src/main/java/com/kamco/cd/training/train/service/DockerTrainService.java b/src/main/java/com/kamco/cd/training/train/service/DockerTrainService.java index 4949047..2d3325b 100644 --- a/src/main/java/com/kamco/cd/training/train/service/DockerTrainService.java +++ b/src/main/java/com/kamco/cd/training/train/service/DockerTrainService.java @@ -9,6 +9,8 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -57,23 +59,58 @@ public class DockerTrainService { Process p = pb.start(); // 로그는 별도 스레드에서 읽기 (메인 스레드가 readLine에 안 걸리게) - StringBuilder log = new StringBuilder(); + StringBuilder logBuilder = new StringBuilder(); + + Pattern epochPattern = Pattern.compile("(?i)\\bepoch\\s*\\[?(\\d+)\\s*/\\s*(\\d+)\\]?\\b"); + Thread logThread = new Thread( () -> { try (BufferedReader br = new BufferedReader( new InputStreamReader(p.getInputStream(), StandardCharsets.UTF_8))) { + String line; while ((line = br.readLine()) != null) { - synchronized (log) { - log.append(line).append('\n'); + + // 1) 원래 하던 로그 누적 + synchronized (logBuilder) { + logBuilder.append(line).append('\n'); + } + + // 2) 🔥 epoch 감지 + DB 업데이트 + Matcher m = epochPattern.matcher(line); + if (m.find()) { + int currentEpoch = Integer.parseInt(m.group(1)); + int totalEpoch = Integer.parseInt(m.group(2)); + + log.info("[EPOCH] container={} {}/{}", containerName, currentEpoch, totalEpoch); + + // TODO 실행중인 에폭 저장 필요하면 만들어야함 + // modelTrainMngCoreService.updateCurrentEpoch(modelId, + // currentEpoch, totalEpoch); } } - } catch (Exception ignored) { + } catch (Exception e) { + log.warn("logThread error: {}", e.toString()); } }, "train-log-" + containerName); + // new Thread( + // () -> { + // try (BufferedReader br = + // new BufferedReader( + // new InputStreamReader(p.getInputStream(), StandardCharsets.UTF_8))) { + // String line; + // while ((line = br.readLine()) != null) { + // synchronized (log) { + // log.append(line).append('\n'); + // } + // } + // } catch (Exception ignored) { + // } + // }, + // "train-log-" + containerName); logThread.setDaemon(true); logThread.start(); @@ -90,8 +127,8 @@ public class DockerTrainService { killContainer(containerName); String logs; - synchronized (log) { - logs = log.toString(); + synchronized (logBuilder) { + logs = logBuilder.toString(); } return new TrainRunResult( @@ -108,8 +145,8 @@ public class DockerTrainService { logThread.join(500); String logs; - synchronized (log) { - logs = log.toString(); + synchronized (logBuilder) { + logs = logBuilder.toString(); } return new TrainRunResult(null, containerName, exit, exit == 0 ? "SUCCESS" : "FAILED", logs);