Add HH:MM:SS timestamp to each log line in detail and log modals
Docker Build and Push / build-and-push (cuda, 12.6) (push) Has been skipped
Docker Build and Push / build-and-push (cuda, 11.8) (push) Has been skipped
Docker Build and Push / check-secrets (push) Successful in 4s
Docker Build and Push / build-and-push (cpu, latest) (push) Has been skipped
Docker Build and Push / build-and-push (directml, latest) (push) Has been skipped
Docker Build and Push / build-and-push (cuda, 12.8) (push) Has been skipped
Build Windows CPU / build (push) Has been cancelled
Build Windows CUDA 11.8 / build (push) Has been cancelled
Build Windows CUDA 12.6 / build (push) Has been cancelled
Build Windows CUDA 12.8 / build (push) Has been cancelled
Build Windows DirectML / build (push) Has been cancelled

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
liuchen
2026-06-27 15:54:32 +08:00
co-authored by Claude Haiku 4.5
parent f21f844f0f
commit b772ab3def
+17 -8
View File
@@ -1127,16 +1127,24 @@ async function loadDetailLogs(taskId) {
try {
const d = await api(`/api/tasks/${taskId}/logs`);
// 合并 DB 历史 + 内存实时日志(去重)
const dbMsgs = d.logs?.map(l => l.message) || [];
const memMsgs = (S.logs[taskId] || []).map(l => l.message);
const extra = memMsgs.filter(m => !dbMsgs.includes(m));
const all = [...dbMsgs, ...extra];
const dbLogs = d.logs || [];
const dbMsgs = dbLogs.map(l => l.message);
const memEntries = (S.logs[taskId] || []).filter(l => !dbMsgs.includes(l.message));
// 合并:DB 记录(含时间戳)+ 内存实时日志
const all = [
...dbLogs.map(l => ({ ts: l.ts, message: l.message })),
...memEntries,
];
if (!all.length) {
el.innerHTML = '<div style="color:var(--muted)">暂无日志</div>';
} else {
el.innerHTML = all.map(m => {
const isErr = /error|failed|exception/i.test(m);
return `<div style="${isErr ? 'color:var(--bad)' : ''}">${esc(m)}</div>`;
el.innerHTML = all.map(entry => {
const ts = entry.ts
? new Date(typeof entry.ts === 'string' ? entry.ts + (entry.ts.includes('Z') || entry.ts.includes('+') ? '' : 'Z') : entry.ts * 1000)
.toLocaleTimeString('zh-CN', {hour:'2-digit', minute:'2-digit', second:'2-digit'})
: '--:--:--';
const isErr = /error|failed|exception/i.test(entry.message);
return `<div style="${isErr ? 'color:var(--bad)' : ''}"><span style="color:var(--muted);margin-right:10px;user-select:none">${ts}</span>${esc(entry.message)}</div>`;
}).join('');
el.scrollTop = el.scrollHeight;
}
@@ -1397,9 +1405,10 @@ function appendLog(taskId, message) {
const el = document.getElementById('detailLogs');
if (el) {
const isErr = /error|failed|exception/i.test(message);
const ts = new Date().toLocaleTimeString('zh-CN', {hour:'2-digit', minute:'2-digit', second:'2-digit'});
const div = document.createElement('div');
if (isErr) div.style.color = 'var(--bad)';
div.textContent = message;
div.innerHTML = `<span style="color:var(--muted);margin-right:10px;user-select:none">${ts}</span>${esc(message)}`;
if (el.querySelector('[style*="加载中"], [style*="暂无"]')) el.innerHTML = '';
el.appendChild(div);
el.scrollTop = el.scrollHeight;