export type ParsedLogLine = { time?: string; level?: string; subsystem?: string; module?: string; message: string; raw: string; }; function extractMessage(value: Record): string { const parts: string[] = []; for (const key of Object.keys(value)) { if (!/^\d+$/.test(key)) continue; const item = value[key]; if (typeof item === "string") { parts.push(item); } else if (item != null) { parts.push(JSON.stringify(item)); } } return parts.join(" "); } function parseMetaName(raw?: unknown): { subsystem?: string; module?: string } { if (typeof raw !== "string") return {}; try { const parsed = JSON.parse(raw) as Record; return { subsystem: typeof parsed.subsystem === "string" ? parsed.subsystem : undefined, module: typeof parsed.module === "string" ? parsed.module : undefined, }; } catch { return {}; } } export function parseLogLine(raw: string): ParsedLogLine | null { try { const parsed = JSON.parse(raw) as Record; const meta = parsed._meta as Record | undefined; const nameMeta = parseMetaName(meta?.name); const levelRaw = typeof meta?.logLevelName === "string" ? meta.logLevelName : undefined; return { time: typeof parsed.time === "string" ? parsed.time : typeof meta?.date === "string" ? meta.date : undefined, level: levelRaw ? levelRaw.toLowerCase() : undefined, subsystem: nameMeta.subsystem, module: nameMeta.module, message: extractMessage(parsed), raw, }; } catch { return null; } }