מודול 1 · לפני שמעלים — שיעור 2 מתוך 5

לוגים שאפשר לחפש בהם

11 דקות קריאה

התחברו כדי שההתקדמות בקורס תישמר בחשבון.

למה 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 שלה בלוגים. אם לא מצאתם את כל השרשרת — חסר לכם הקשר, וזה מה שיכאב בלילה שבו יהיה לכם תור של תקלות.