Add job logging and increase timeout to 20 minutes
- Add JobLogger class to handler.py for structured timestamped logging - Increase MAX_TIMEOUT from 600s to 1200s (20 minutes) - Add logs column to generated_content table via migration - Store and display job execution logs in gallery UI - Add Logs button to gallery items with modal display Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -437,6 +437,7 @@ function renderGallery(container, items) {
|
||||
<div class="gallery-item-meta">
|
||||
<span>${formatDate(item.createdAt)}</span>
|
||||
<div class="gallery-item-actions">
|
||||
<button class="btn btn-sm btn-secondary view-logs-btn" data-content-id="${item.id}">Logs</button>
|
||||
${item.status === 'completed' ? `<a href="/api/content/${item.id}/download" class="btn btn-sm btn-secondary">Download</a>` : ''}
|
||||
<button class="btn btn-sm btn-danger delete-content-btn" data-content-id="${item.id}">Delete</button>
|
||||
</div>
|
||||
@@ -470,6 +471,48 @@ function renderGallery(container, items) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
container.querySelectorAll('.view-logs-btn').forEach(btn => {
|
||||
btn.addEventListener('click', async function() {
|
||||
const contentId = parseInt(this.dataset.contentId, 10);
|
||||
await viewContentLogs(contentId);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function viewContentLogs(contentId) {
|
||||
try {
|
||||
const data = await api(`/content/${contentId}/logs`);
|
||||
const logs = data.logs || [];
|
||||
const errorMessage = data.errorMessage;
|
||||
|
||||
let logsHtml = '';
|
||||
if (logs.length === 0) {
|
||||
logsHtml = '<p style="color:var(--gray-500);text-align:center;">No logs available</p>';
|
||||
} else {
|
||||
logsHtml = `<div class="logs-content">${logs.map(log => escapeHtml(log)).join('\n')}</div>`;
|
||||
}
|
||||
|
||||
if (errorMessage) {
|
||||
logsHtml = `<div class="logs-error"><strong>Error:</strong> ${escapeHtml(errorMessage)}</div>` + logsHtml;
|
||||
}
|
||||
|
||||
showModal(`
|
||||
<div class="modal-header">
|
||||
<h3>Job Logs</h3>
|
||||
<button class="modal-close">×</button>
|
||||
</div>
|
||||
<div class="logs-container">
|
||||
<div class="logs-status">Status: <span class="badge badge-${data.status}">${data.status}</span></div>
|
||||
${logsHtml}
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-secondary modal-cancel-btn">Close</button>
|
||||
</div>
|
||||
`);
|
||||
} catch (error) {
|
||||
alert('Failed to load logs: ' + error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Admin
|
||||
|
||||
Reference in New Issue
Block a user