let logMonitorEl = null; let logMonitorStatus = true; let logWarnings = 0; let logErrors = 0; function dateToStr(ts) { const dt = new Date(1000 * ts); const year = dt.getFullYear(); const mo = String(dt.getMonth() + 1).padStart(2, '0'); const day = String(dt.getDate()).padStart(2, '0'); const hour = String(dt.getHours()).padStart(2, '0'); const min = String(dt.getMinutes()).padStart(2, '0'); const sec = String(dt.getSeconds()).padStart(2, '0'); const ms = String(dt.getMilliseconds()).padStart(3, '0'); const s = `${year}-${mo}-${day} ${hour}:${min}:${sec}.${ms}`; return s; } async function logMonitor() { if (logMonitorStatus) setTimeout(logMonitor, opts.logmonitor_refresh_period); if (!opts.logmonitor_show) return; logMonitorStatus = false; let res; try { res = await fetch('/sdapi/v1/log?clear=True'); } catch {} if (res?.ok) { logMonitorStatus = true; if (!logMonitorEl) { logMonitorEl = document.getElementById('logMonitorData'); logMonitorEl.onscrollend = () => { const at_bottom = logMonitorEl.scrollHeight <= (logMonitorEl.scrollTop + logMonitorEl.clientHeight); if (at_bottom) logMonitorEl.parentElement.style = ''; }; } if (!logMonitorEl) return; const at_bottom = logMonitorEl.scrollHeight <= (logMonitorEl.scrollTop + logMonitorEl.clientHeight); const lines = await res.json(); if (logMonitorEl && lines?.length > 0) logMonitorEl.parentElement.parentElement.style.display = opts.logmonitor_show ? 'block' : 'none'; for (const line of lines) { try { const l = JSON.parse(line); const row = document.createElement('tr'); // row.style = 'padding: 10px; margin: 0;'; const level = `${l.level}`; if (l.level === 'WARNING') logWarnings++; if (l.level === 'ERROR') logErrors++; const module = `${l.module}`; row.innerHTML = `${dateToStr(l.created)}${level}${l.facility}${module}${l.msg}`; logMonitorEl.appendChild(row); } catch (e) { console.log('logMonitor', e); console.error('logMonitor line', line); } } while (logMonitorEl.childElementCount > 100) logMonitorEl.removeChild(logMonitorEl.firstChild); if (at_bottom) logMonitorEl.scrollTop = logMonitorEl.scrollHeight; else if (lines?.length > 0) logMonitorEl.parentElement.style = 'border-bottom: 2px solid var(--highlight-color);'; document.getElementById('logWarnings').innerText = logWarnings; document.getElementById('logErrors').innerText = logErrors; } } let logMonitorInitialized = false; async function initLogMonitor() { if (logMonitorInitialized) return; const el = document.getElementsByTagName('footer')[0]; if (!el) return; logMonitorInitialized = true; el.classList.add('log-monitor'); el.innerHTML = `
Time Level Module Message Warnings 0 Errors 0
`; el.style.display = 'none'; fetch(`/sdapi/v1/start?agent=${encodeURI(navigator.userAgent)}`); logMonitor(); log('initLogMonitor'); } onAfterUiUpdate(initLogMonitor);