למה console.log לא מספיק
כשמשהו נשבר בשרת, יש לכם שני כלים: הלוגים והשחזור. לוג טוב עונה על ארבע שאלות — מה קרה, מתי, למי, ובאיזו בקשה — בפורמט שאפשר לסנן ולחפש בו.
console.log("user saved"); // חסר הקשר
logger.info({ userId, durationMs, event: "user.saved" }, "user saved"); // אפשר לחפש
פורמט: JSON שורה אחת
לוגים בפורמט מובנה (structured) הם הדרך היחידה לחפש לעומק. בכל שורה: חותמת זמן ISO, רמה, הודעה, ושדות.
{"ts":"2026-10-29T20:31:02.114Z","level":"info","event":"request","method":"GET","path":"/courses","status":200,"ms":38,"reqId":"c1f2"}
מזהה בקשה
הדבר היחיד שהכי משפר דיבוג: reqId לכל בקשה נכנסת, שמופיע בכל לוג שנגרם ממנה — כולל שאילתות ל-DB וקריאות לשירותים חיצוניים.
app.use((req, res, next) => {
req.id = crypto.randomUUID();
res.setHeader("x-request-id", req.id);
next();
});
עם הכותרת הזאת בתשובה, משתמש יכול לדווח "קיבלתי שגיאה, ה-ID הוא ..." ואתם מוצאים את כל השרשרת בשנייה.
רמות, ומה שמים בכל אחת
| רמה | מתי | דוגמה |
|---|---|---|
error |
משהו נכשל ומישהו צריך לטפל | כשל בשמירה, תשובה 5xx |
warn |
לא כשל, אבל לא תקין | retry, קונפיגורציה עם ברירת מחדל |
info |
אירועים עסקיים | נרשם משתמש, קורס הושלם |
debug |
פיתוח ואבחון | שאילתות, זמנים |
אם כל דבר הוא info, אין רמות. אם כל בקשה נרשמת ב-error, אין אות.
מה לא לרשום
- סיסמאות, טוקנים, עוגיות, מספרי כרטיס.
- גוף בקשה מלא (עלול להכיל הכל).
process.envשלם.- מידע אישי מעבר למזהה.
בדיקה
הריצו בקשה שגויה בכוונה וחפשו את ה-reqId שלה בלוגים. אם לא מצאתם את כל השרשרת — חסר לכם הקשר, וזה מה שיכאב בלילה שבו יהיה לכם תור של תקלות.