غیرفعالکردن کامل لاگها در Laravel
در بسیاری از پروژههای لاراول، به ویژه پروژههای کوچک یا داخلی، فایل storage/logs/laravel.log بهمرور زمان بزرگ میشود. در حالی که نه مانیتورینگی روی آن وجود دارد و نه کسی آن را بررسی میکند.
در این شرایط، ذخیرهٔ لاگها هیچ ارزش عملی ایجاد نمیکند و باعث اتلاف فضای دیسک و کاهش عمر آن میشود.
در این مقاله راه حل غیرفعال کردن لاگ لاراول را در نگارش ۱۲ و احتمالا نسخههای بعدی بررسی میکنیم.
چه زمانی غیرفعالکردن لاگها تصمیم درستی است؟
غیرفعالکردن لاگها همیشه تصمیم درستی نیست، اما در این سناریوها کاری منطقی است:
- پروژه مانیتورینگ (Sentry، Bugsnag، ELK و …) ندارد
- خطاها به روش دیگری گزارش میشوند
- لاگها فقط در سطح debug تولید میشوند و بررسی نمیشوند
- برنامه روی سرورهایی با فضای دیسک محدود اجرا میشود
- پروژه داخلی یا موقت است و نیاز به نگهداری طولانیمدت لاگها ندارد
در این شرایط، ذخیرهٔ لاگ مزیتی ندارد و تنها یک فایل بدون کاربرد با حجم زیاد را ایجاد میکند.
راه حل توقف ایجاد فایل لاگ
اولین راه حلی که ممکن است به نظر برسد، تنظیم این مقدار در فایل .env است.
|
1 |
LOG_CHANNEL=null |
اما در Laravel 12 این تنظیم در عمل کار نمیکند و فایل لاگ همچنان ایجاد میشود و حجم آن افزایش پیدا میکند.
تعریف کانال نال در تنظیمات لاراول به این شکل انجام شده است.
|
1 2 3 4 |
'null' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ], |
به دلیل اینکه مقدار null در لاراول یک حالت کنترلی داخلی است، نه یک کانال واقعی که قابل تخصیص باشد. لاراول آن را نادیده میگیرد و ممکن است از کانالهای جایگزین استفاده کند.
راهحل در Laravel 12
برای حل این مشکل کار سادهای پیش روی ماست. کافیست عبارت null را به یک نام دیگر مثل discard جایگزین کنیم.
خروجی ما به شکل زیر خواهد شد:
در فایل config/logging.php
|
1 2 3 4 |
'discard' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ], |
پس از انجام این تغییرات، میتوانیم در فایل .env تنظیمات لاگ را به این شکل انجام بدهیم:
|
1 |
LOG_CHANNEL=discard |
اگر کانفیگ cache شده است، دستور زیر را اجرا کنید تا کش موجود حذف شود و از فایل اصلی استفاده کند.
|
1 |
php artisan config:clear |
غیرفعال کردن شرطی لاگ
با درج کدهای زیر در logging.php میتوانید در صورتی که پروژه روی سرور اصلی فعال است، لاگ را غیرفعال کنید و در زمان کدنویسی همچنان به لاگها دسترسی داشته باشید.
|
1 |
'default' => app()->environment('production') ? 'discard' : 'stack', |
همچنین میتوانید فقط لاگهای کماهمیت را از خروجی حذف کنید و موارد مهم همچنان در خروجی باقی بمانند.
|
1 2 3 4 5 |
'discard' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, 'level' => 'error', ], |
گزینههای دیگری که میتوانید برای سطح خطاها تعیین کنید به شکل زیر هستند:
|
1 2 3 4 5 |
debug info warning error critical |
در حالت پیشفرض یا debug تمام خطاها لاگ میشوند، با تعیین سطوح پایینتر، خطاهای مهمتر ذخیره میشوند و خطاهای کماهمیتتر نادیده گرفته میشوند.