Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۳ دقیقه·۴ سال پیش

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

ساختن یه میدلویر برا لاگ گرفتن ریکوئست ها
ساختن یه میدلویر برا لاگ گرفتن ریکوئست ها

قبل از همه چیز بگم که morgan یه middleware هست برای لاگ گرفتن از درخواستایی که میاد. به عنوان یه dependency نصبش کنید. برای اینکه از morgan استفاده بکنید کافیه تا اونو کانفیگ کنید و بعدش به عنوان یه middleware به express معرفیش بکنید.

این پکیج ۲ تا آرگومان میگیره:

  1. آرگومان اول که format هستش و یه format string از پیش تعریف شده، tiny هست که نشون دهنده حداقل تنظیمات از پیش تعیین شده هست. `morgan('tiny')`
  2. آرگومان 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}));

به همین سادگی یه فایل ساخته میشه و لاگ ها توش ذخیره میشن.

node jsmorganلاگ گرفتن از ریکوئست هانود جی‌اسhttp request log
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید