پکیج morgan برای لاگ گرفتن درخواست ها تو سرور HTTP

ساختن یه میدلویر برا لاگ گرفتن ریکوئست هاقبل از همه چیز بگم که morgan یه middleware هست برای لاگ گرفتن از درخواستایی که میاد. به عنوان یه dependency نصبش کنید. برای اینکه از morgan استفاده بکنید کافیه تا اونو کانفیگ کنید و بعدش به عنوان یه middleware به express معرفیش بکنید.این پکیج ۲ تا آرگومان میگیره: آرگومان اول که format هستش و یه format string از پیش تعریف شده، tiny هست که نشون دهنده حداقل تنظیمات از پیش تعیین شده هست. `morgan('tiny')`آرگومان option که تنظیمات بیشتر رو شامل میشه.البته میتونی نوع خورجی morgan رو از طریق یه رشته هم مشخص بکنی: morgan(':method :url :status'); morgan(':method :url :status :res[content-length] - :response-time ms');توکنبه اون نوشته هایی که بعد از : میاد اصطلاحا token گفته میشه. شما می‌تونی توکن های خودت رو هم بسازی که این موضوع morgan رو خیلی کاربردی میکنه. برای مثال من این زیر یه توکن به اسم host تعریف می‌کنمmorgan.token('host', (req, res) => req.hostname); morgan.token('type', (req, res) => req.headers['content-type']);حالا می‌تونیم از اون توی format string استفاده بکنیم:morgan(':method :host :status :res[content-length] - :response-time ms');توکن های تعریف شده برای morgan:date[format] // تاریخ جهانی :http-version // http ورژن :method // http متد :referreer // referrer هدر :remote-addr // آی پی درخواست دهنده :remote-user // نمیدونم :req[header] // هدری که مینویسی، از درخواستی که به سرور وارد شده :res[header] // هدری که میخوای، از جوابی که سرور داره ارسال می‌کنه :response-time[digits] // مدت زمانی که درخواست وارد میدلویر مورگان میشه و هدر های ریسپانس نوشته میشه :status // کد وضعیت ریسپانس سرور، اگه ریسپانسی سرور نده خالی میمونه :url // مسیری که درخواست داده شده :user-agent // User-Agent محتوایشاید برات سوال شده باشه که اون [] (براکت) ها چی هستن؟ اونا نشون دهنده آرگومان هایی هستن که باید به توکن ارسال بشن. مثلا تو این مثال می‌خوایم از توی درخواست پارامتر هایی که از طریق URL ارسال شده رو نمایش بدیم.morgan.token('param', function(req, res, param) { return req.params[param]; }); morgan(':method :host :status :param[id] :res[content-length] - :response-time ms');البته این format میتونه یه تابع هم باشه که اثرش دقیقا مثل اینه `morgan(':method :url :status')`morgan((tokens, req, res) => { return [ tokens.method(req, res), tokens.url(req, res), tokens.status(req, res), ].join(' ') })تنظیمات درون آبجکت Optionsاگه میخوای بعد از اینکه ریکوئست وارد شد لاگ بندازه کافیه immediate رو تو options ست بکنی.اگه میخوای یه وقتای لاگ نگیره میتونی تو skip تو options اینو مشخص بکنیبرای مشخص کردن جریان خروجی میتونی از stream استفاده بکنی. مقدار پیشفرضش process.stdout هست.قالب های از پیش تعریف شدهاستاندارد combined آپاچی برای لاگ:remote-addr - :remote-user [:date[clf]] &quot:method :url HTTP/:http-version&quot :status :res[content-length] &quot:referrer&quot &quot:user-agent&quotاستاندارد common آپاچی برای لاگ:remote-addr - :remote-user [:date[clf]] &quot:method :url HTTP/:http-version&quot :status :res[content-length]برای توسعه میتونی از dev استفاده بکنی. تو این وضعیت status code ها رنگی نمایش داده میشن.:method :url :status :response-time ms - :res[content-length]اگه یه لاگ خیلی کوتاه نیاز داری از short استفاده بکن.:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time msبرای حداقل خروجی هم از tiny استفاده بکن.:method :url :status :res[content-length] - :response-time msنوشتن لاگ ها تو فایلبرای نوشتن تو یه فایل کافیه این جوری عمل بکنیم:const appLogStream = fs.createWriteStream(path.join(__dirname, 'app.log'), { flags: 'a' }); app.use(morgan('combined', { stream: appLogStream}));به همین سادگی یه فایل ساخته میشه و لاگ ها توش ذخیره میشن.