Spaces:
Runtime error
Runtime error
| 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 = `<td style="color: var(--color-${l.level.toLowerCase()})">${l.level}</td>`; | |
| if (l.level === 'WARNING') logWarnings++; | |
| if (l.level === 'ERROR') logErrors++; | |
| const module = `<td style="color: var(--var(--neutral-400))">${l.module}</td>`; | |
| row.innerHTML = `<td>${dateToStr(l.created)}</td>${level}<td>${l.facility}</td>${module}<td>${l.msg}</td>`; | |
| 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 = ` | |
| <table id="logMonitor" style="width: 100%;"> | |
| <thead style="display: block; text-align: left; border-bottom: solid 1px var(--button-primary-border-color)"> | |
| <tr> | |
| <th style="width: 144px">Time</th> | |
| <th>Level</th> | |
| <th style="width: 0"></th> | |
| <th style="width: 154px">Module</th> | |
| <th>Message</th> | |
| <th style="position: absolute; right: 7em">Warnings <span id="logWarnings">0</span></th> | |
| <th style="position: absolute; right: 1em">Errors <span id="logErrors">0</span></th> | |
| </tr> | |
| </thead> | |
| <tbody id="logMonitorData" style="white-space: nowrap; height: 10vh; width: 100vw; display: block; overflow-x: hidden; overflow-y: scroll; color: var(--neutral-400)"> | |
| </tbody> | |
| </table> | |
| `; | |
| el.style.display = 'none'; | |
| fetch(`/sdapi/v1/start?agent=${encodeURI(navigator.userAgent)}`); | |
| logMonitor(); | |
| log('initLogMonitor'); | |
| } | |
| onAfterUiUpdate(initLogMonitor); | |