قبل از همه چیز بگم که morgan یه middleware هست برای لاگ گرفتن از درخواستایی که میاد. به عنوان یه dependency نصبش کنید. برای اینکه از morgan استفاده بکنید کافیه تا اونو کانفیگ کنید و بعدش به عنوان یه middleware به express معرفیش بکنید.
این پکیج ۲ تا آرگومان میگیره:
البته میتونی نوع خورجی 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');
: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(' ') })
استاندارد combined آپاچی برای لاگ
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"
استاندارد common آپاچی برای لاگ
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :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}));
به همین سادگی یه فایل ساخته میشه و لاگ ها توش ذخیره میشن.