• בלוג
  • הדפסת הודעות לוג לקובץ יומן ב Express

הדפסת הודעות לוג לקובץ יומן ב Express

25/12/2018

מורגן הוא מודול תיעוד הבקשות של אקספרס והוא נמצא בכל פרויקט אקספרס שתיצרו עם Express Generator. תוכלו לזהות אותו לפי השורה הבאה בקובץ app.js.

app.use(morgan('dev'));

וינסטון היא ספריית ניהול יומן ביישומי Node. מעניין לראות איך נחבר בין וינסטון למורגן כדי שההודעות שמורגן מדפיס ירשמו בצורה מסודרת לקובץ יומן, כמו שמקובל בשרתים אמיתיים.

1. יצירת הפרויקט

תחילה צרו פרויקט חדש והתקינו שם את וינסטון עם:

express --view ejs 28-useful-middlewares
cd 28-useful-middlewares
npm install --save winston

את מורגן אין צורך להתקין כי הוא מותקן אוטומטית עם אקספרס. עכשיו צרו תיקיה חדשה בשם lib ובתוכה קובץ בשם logger.js עם התוכן הבא:

const winston = require('winston');

winston.configure({
    format: winston.format.simple(),
    transports: [
        new winston.transports.File({ filename: 'log/app.log'}),
    ]
});


if (process.env['NODE_ENV'] !== 'production') {
    winston.add(new winston.transports.Console());
}

module.exports = winston;

הקוד מייצר יומן שרושם לקובץ בשם app.log בתיקיית log. במצב פיתוח הוא גם רושם כל הודעה לקונסול כדי שנוכל לראות אותה על המסך.

2. עדכון app.js ושימוש בלוגר החדש שלנו

נחזור לקובץ app.js כדי לרשום את כל ההודעות של מורגן לקובץ היומן שלנו. קודם כל נשנה את השם של מורגן מ logger ל morgan כדי שיהיה יותר ברור מה התפקיד של כל מודול ונטען את היומן שלנו:

var morgan = require('morgan');
var logger = require('./lib/logger');

לאחר מכן נחליף את הקוד שמשתמש במורגן כך שיעביר לו גם פונקציית כתיבה שלנו שקוראת לוינסטון ורושמת את כל הבקשות ביומן. כך נראה הקוד:

app.use(morgan('combined', { stream: { write: function(msg, _encoding) {
  logger.info(msg);
}}}));

הפרמטר dev שהפך למילה combined קובע את פורמט ההודעה שמורגן יבנה. הפורמט dev כולל את הצבעים ומתאים למצב פיתוח, הפורמט combined מציג הודעות עם יותר מידע ובלי צבעים כך שיתאימו לכתיבה לקובץ.

הפרמטר השני הוא אוביקט אפשרויות ושם האפשרות במפתח stream צריכה לקבל אוביקט עם פונקציה בשם write. מורגן יפעיל פונקציה זו כדי לכתוב כל הודעה, ואנחנו שם פשוט קוראים לוינסטון כדי לתעד את ההודעה.

התוצאה שעכשיו במצב פיתוח ההודעות יופיעו גם למסך וגם לקובץ, ועל השרת כל הודעות היומן יירשמו לקובץ היומן בלבד. הודעות אחרות מהקוד שלכם תוכלו לרשום באמצעות וינסטון ולקבל את כל הודעות היומן באותו מקום.

למידע נוסף ופיצ'רים מעניינים של וינסטון שווה להעיף מבט בדף התיעוד של הספריה בקישור:

https://github.com/winstonjs/winston#readme