Add comprehensive local logging to all microservices; log all errors locally and forward to error_log_api

This commit is contained in:
Sven laptop
2026-09-23 20:00:30 +02:00
parent 50634a3ed7
commit b36975b680
4 changed files with 54 additions and 28 deletions
+14 -4
View File
@@ -64,6 +64,7 @@ app.use((req, res, next) => {
if (res.statusCode >= 400 && body && typeof body === "object") {
const rawError =
body.error || body.message || body.details || `HTTP ${res.statusCode}`;
log("warn", `HTTP ${res.statusCode}`, { path: req.originalUrl, method: req.method, error: rawError });
void reportError({
partofservice: `${req.method} ${req.originalUrl}`,
error: rawError,
@@ -110,18 +111,22 @@ async function insertErrorLog({
function verifyAdmin(req, res, next) {
const auth = req.headers.authorization;
if (!auth || !auth.startsWith("Bearer ")) {
log("warn", "Missing or invalid Authorization header", { path: req.originalUrl });
return res.status(401).json({ error: toFriendlyError(401) });
}
try {
const payload = jwt.verify(auth.slice(7), JWT_SECRET);
if (!payload?.isAdmin) {
log("warn", "Non-admin user attempted admin access", { userCode: payload?.userCode, path: req.originalUrl });
return res.status(403).json({ error: toFriendlyError(403) });
}
req.user = payload;
return next();
} catch (err) {
log("error", "JWT verification failed", { error: err.message, path: req.originalUrl });
reportError({ partofservice: `verifyAdmin ${req.method} ${req.originalUrl}`, error: err.stack || err.message });
return res.status(401).json({ error: toFriendlyError(401) });
}
}
@@ -131,7 +136,8 @@ app.get("/health", async (_req, res) => {
await db.query("SELECT 1");
res.json({ status: "ok", service: "error_log_api", database: "ok" });
} catch (err) {
console.error("GET /health error:", err);
log("error", "Health check DB query failed", { error: err.message, stack: err.stack });
reportError({ partofservice: "GET /health", error: err.stack || err.message });
res.status(503).json({ status: "unavailable", service: "error_log_api" });
}
});
@@ -144,13 +150,15 @@ app.post("/error_log", async (req, res) => {
const error = req.body?.error;
if (!service || !error) {
log("warn", "Missing required fields in error_log", { body: req.body });
return res.status(400).json({ error: toFriendlyError(400) });
}
await insertErrorLog({ service, partofservice, error });
return res.status(201).json({ ok: true });
} catch (err) {
console.error("POST /error_log failed:", err);
log("error", "POST /error_log failed", { error: err.message, stack: err.stack });
reportError({ partofservice: "POST /error_log", error: err.stack || err.message });
return res.status(500).json({ error: toFriendlyError(500) });
}
});
@@ -189,12 +197,14 @@ app.get("/error_log", verifyAdmin, async (req, res) => {
return res.json({ errors: rows.rows });
} catch (err) {
console.error("GET /error_log failed:", err);
log("error", "GET /error_log failed", { error: err.message, stack: err.stack });
reportError({ partofservice: "GET /error_log", error: err.stack || err.message });
return res.status(500).json({ error: toFriendlyError(500) });
}
});
app.use(async (err, req, res, _next) => {
log("error", "Unhandled error", { error: err?.message, stack: err?.stack, path: req.originalUrl });
try {
await insertErrorLog({
service: "error_log_api",
@@ -202,7 +212,7 @@ app.use(async (err, req, res, _next) => {
error: err?.stack || err?.message || String(err),
});
} catch (logErr) {
console.error("Failed to log internal error:", logErr);
log("error", "Failed to log internal error", { error: logErr.message });
}
if (res.headersSent) return;