(rows)
| 64 | } |
| 65 | |
| 66 | function renderLogs(rows) { |
| 67 | if (!Array.isArray(rows) || rows.length === 0) { |
| 68 | el.logConsole.innerHTML = ` |
| 69 | <div class="log-line"> |
| 70 | <span class="log-time">-</span> |
| 71 | <span class="log-level INFO">INFO</span> |
| 72 | <span class="log-logger">system</span> |
| 73 | <span class="log-message">暂无日志</span> |
| 74 | </div> |
| 75 | `; |
| 76 | return; |
| 77 | } |
| 78 | |
| 79 | el.logConsole.innerHTML = rows.map((row) => { |
| 80 | const level = String(row.level || "INFO").toUpperCase(); |
| 81 | const msg = row.exception ? `${row.message || ""}\n${row.exception}` : (row.message || ""); |
| 82 | return ` |
| 83 | <div class="log-line"> |
| 84 | <span class="log-time">${escapeHtml(format.date(row.created_at))}</span> |
| 85 | <span class="${getLevelClass(level)}">${escapeHtml(level)}</span> |
| 86 | <span class="log-logger" title="${escapeHtml(row.logger || "")}">${escapeHtml(row.logger || "-")}</span> |
| 87 | <span class="log-message">${escapeHtml(msg || "-")}</span> |
| 88 | </div> |
| 89 | `; |
| 90 | }).join(""); |
| 91 | } |
| 92 | |
| 93 | function collectFilters() { |
| 94 | logsState.filters.level = String(el.filterLevel.value || "").trim().toUpperCase(); |
no test coverage detected