From 7489b5ef978da182e1b84c22474cd6b54067a1ea Mon Sep 17 00:00:00 2001 From: Dmitriy Petrov Date: Fri, 8 May 2026 18:45:16 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=83=D1=80=D0=BE=D0=B2=D0=B5=D0=BD=D1=8C=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B0=20sing-box=20=D0=B8=D0=B7=20stderr=20=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20hardcode=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/index.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/server/index.js b/src/server/index.js index 172b6ed..54b3448 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -30,7 +30,18 @@ function pushLog(level, line) { } } -function captureStream(stream, level) { +// Sing-box пишет все логи в stderr, поэтому парсим уровень из содержимого строки +const SINGBOX_LEVEL_RE = /\[\d+m(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\[0m/i; +function parseSingboxLevel(line, fallback) { + const m = line.match(SINGBOX_LEVEL_RE); + if (!m) return fallback; + const l = m[1].toLowerCase(); + if (l === "warn") return "warning"; + if (l === "fatal") return "error"; + return l; // trace, debug, info, error +} + +function captureStream(stream, fallbackLevel) { let remainder = ""; stream.setEncoding("utf8"); stream.on("data", (chunk) => { @@ -39,12 +50,14 @@ function captureStream(stream, level) { remainder = lines.pop() || ""; for (const line of lines) { if (!line) continue; + const level = parseSingboxLevel(line, fallbackLevel); process.stdout.write(`[sing-box:${level}] ${line}\n`); pushLog(level, line); } }); stream.on("end", () => { if (remainder) { + const level = parseSingboxLevel(remainder, fallbackLevel); process.stdout.write(`[sing-box:${level}] ${remainder}\n`); pushLog(level, remainder); }