let logSource = null; let currentUnit = null; const MAX_LOG_LINES = 2000; let logLines = []; function colorLog(line) { let s = line .replace(/&/g, "&") .replace(//g, ">"); const levels = [ ["TRACE", "log-trace"], ["DEBUG", "log-debug"], ["INFO", "log-info"], ["WARN", "log-warn"], ["WARNING", "log-warn"], ["ERROR", "log-error"], ["FATAL", "log-fatal"], ["PANIC", "log-panic"] ]; for (const [level, cls] of levels) { if (s.includes(level) || s.includes(level.toLowerCase())) { return `${s}`; } } return `${s}`; } function connectLog(unit, target) { const el = typeof target === "string" ? document.getElementById(target) : target; if (!el) { console.error("[log-stream] target element not found"); return; } if (currentUnit === unit && logSource && logSource.readyState !== EventSource.CLOSED) { return; } disconnectLog(); currentUnit = unit; logLines = []; el.textContent = ""; const source = new EventSource( `/api/service/log?unit=${encodeURIComponent(unit)}` ); logSource = source; source.onmessage = (e) => { if (source !== logSource) { return; } logLines.push(e.data); if (logLines.length > MAX_LOG_LINES) { logLines.splice( 0, logLines.length - MAX_LOG_LINES ); } el.innerHTML = logLines .map(colorLog) .join("
") + "


"; el.scrollTop = el.scrollHeight; }; source.onerror = () => { if (source !== logSource) { return; } console.log( `[log-stream] error unit=${unit}, state=${source.readyState}` ); }; } function disconnectLog() { if (logSource) { logSource.close(); logSource = null; } currentUnit = null; logLines = []; } function getCurrentUnit() { return currentUnit; } function clearLog(target) { logLines = []; const el = typeof target === "string" ? document.getElementById(target) : target; if (el) { el.textContent = ""; } } function copyLog(target) { const el = typeof target === "string" ? document.getElementById(target) : target; if (!el) return; const text = el.value !== undefined ? el.value : el.innerText; if (navigator.clipboard) { navigator.clipboard.writeText(text) .then(() => alert("复制成功")); } else { const ta = document.createElement("textarea"); ta.value = text; document.body.appendChild(ta); ta.select(); document.execCommand("copy"); ta.remove(); alert("复制成功"); } }