لاراول ، لاگ ریکوئست ها

بعضی کارها هست که ممکنه اول پروژه بهش فکر نکنید و بعدا یه روزی خیلی شدید نیازتون بشه و با خودتون بگید کاش از اول این کارارو میکردم . مثل Backup گرفتن . که تا وقتی که یهو دیتاتون رو از دست ندید قدرش رو نمیدونید ! ( در مورد بک آپ بعدا مفصل صحبت می کنیم ) . لاگ ریکوئست ها هم همینطور .

چرا باید ریکوئست ها رو لاگ کنیم ؟

در یک پروژه که خط تولید یک کارخونه توسط وب اپ مدیریت می شد ، یه سری صفحه بودن که مهندسین و اپراتورهای بخش برنامه ریزی تولید ، قطعات مختلف یک محصول رو توی سیستم تعریف میکردن . مثلا یک میز شامل تعدادی board , layer , profile , part و ... میشه . که هر کدوم باید ازش کلی اطلاعات وارد کنن مثلا نوع mdf .. مسیری که باید توی کارخونه طی کنه ، نقشه های برش ، تامین کننده و و و ....

خب . مهندس معمار یا اپراتور می نشست پشت سیستم و مثلا برای یک میز ساده حدود 10-20 دقیقه با دقت و حوصله تمام آیتم ها رو وارد میکرد . بعد که save رو میزد ، یهو بنا به هر دلیلی ( که بالاخره جلوی اون هارو هم تا جایی که میشه باید گرفت ) دیتا از دست میرفت و ذخیره نمیشد .... !!!! آقا این چه وضعشه . آقا من 20 دقیقه وقت گذاشتم ... و و و ....

در مورد بعدی مثلا مدیریت میاد میگه که فلان آیتم یا فلان محصول رو کی وارد سیستم کرده ؟ چه زمانی ؟ مرورگرش چی بوده آی پیش چی بوده و و و ....

اون موقع با خودتون میگید چه خوب میشد یه سیستم لاگ داشتیم که همه ریکوئست ها رو با اطلاعات فرستنده نگه می داشت و راحت میشد رفت خوندش ( مثلا یک فایل حجیم یا قاطی پاتی توی سرور نمیبود ) و دسترسی بهش آسون میبود . اصلا یه بخش گرافیکی خوشگل توی سایت میبود که لاگ ها رو نشون میداد .

خب . حالا شاید قدر این قضیه بیشتر دونسته بشه .

اینکار خیلی سخت نیست و میتونید مثلا از پکیج زیر استفاده کنید :

https://github.com/spatie/laravel-http-logger


ولی من توی این مورد ترجیح دادم یک روش خودم داشته باشم و پیادش کنم .

یه table ساختم با مشخصات زیر :

https://gist.github.com/faridfr/d4e73760c7fd94ff5f7940e7a870e00b


و از اونور توی controller اصلی که همه ازش ارث بری میکنن این قطعه کد رو نوشتم (‌ روش های جالب تر و بهتری هم هست مثل نوشتن middleware )

https://gist.github.com/faridfr/759b9952feb97adc48cf2038b546d862


نکته های کد بالا :

  • من روشی که آی دی کاربر رو بدست میاوردم رو از قطعه کد حذف کردم. شما بسته به روش authentication‌ سیستمتون آی دی کاربر رو توی متغیر مربوطه ذخیره کنید .
  • برای تشخیص agent ( مثلا نوع مرورگر و موبایل و ... ) از کتابخونه ی jenssegers/agent استفاده کردم و برای خودم یه helper function نوشتم که همه جا بتونم ازش استفاده کنم . خروجی این تابع هم یه رشته هست که نمونش رو توی عکس زیر که همون تیبل logs هست میبینید .
  • من این شرط رو گذاشتم که اگر ریکوئست کلاینت GET نبود ذخیره کن . اگر دوست دارید میتونید این شرط رو بردارید .
  • اگر مثل ما کل سیستمون API based هست این سایت برای خوشگل کردن ورودی های json اپراتور ها ممکنه به دردتون بخوره : https://jsonformatter.org
  • نیاز ما نبوده که فعلا خروجی api رو ذخیره کنیم اما شما میتونین این کار رو انجام بدید .
نمونه لاگ ذخیره شده . به ستون های agent و input دقت کنین .
نمونه لاگ ذخیره شده . به ستون های agent و input دقت کنین .


در نهایت بهترین روش رو خودتون سریع میتونید پیدا کنید و از بهترین کتابخونه ها واسه این کار استفاده کنید اما پیشنهاد من اینه که از این کار دریغ نکنین :) موفق باشین