ورود به سیستم
- معرفی
- پیکربندی
- ساخت پشته سیاهههای مربوط
- نوشتن پیام های گزارش
- سفارشی سازی کانال مونولوگ
- دنبال کردن پیام های گزارش با استفاده از Pail
معرفی
برای کمک به کسب اطلاعات بیشتر در مورد آنچه در برنامه شما اتفاق می افتد، لاراول خدمات گزارش گیری قوی ارائه می دهد که به شما امکان می دهد پیام ها را در فایل ها، گزارش خطای سیستم و حتی به Slack ثبت کنید تا به کل تیم خود اطلاع دهید.
لاگ لاراول بر اساس "کانال ها" است. هر کانال نشان دهنده روش خاصی برای نوشتن اطلاعات گزارش است. به عنوان مثال،
single
کانال فایل های گزارش را در یک فایل گزارش می نویسد، در حالی که
slack
کانال پیام های گزارش را برای Slack ارسال می کند. پیام های گزارش ممکن است بر اساس شدت آنها در چندین کانال نوشته شوند.
لاراول در زیر هود از کتابخانه Monolog استفاده می کند که از انواع کنترل کننده های لاگ قدرتمند پشتیبانی می کند. لاراول پیکربندی این دستهها را سخت میکند و به شما این امکان را میدهد که آنها را ترکیب و مطابقت دهید تا مدیریت گزارش برنامه خود را سفارشی کنید.
پیکربندی
تمام گزینه های پیکربندی که رفتار لاگ برنامه شما را کنترل می کنند در
config/logging.php
فایل پیکربندی قرار دارند. این فایل به شما امکان می دهد کانال های گزارش برنامه خود را پیکربندی کنید، بنابراین حتماً هر یک از کانال های موجود و گزینه های آنها را بررسی کنید. در زیر چند گزینه رایج را بررسی خواهیم کرد.
به طور پیش فرض، لاراول از
stack
کانال هنگام ثبت پیام ها استفاده می کند. این
stack
کانال برای جمع آوری چندین کانال ورود به سیستم در یک کانال واحد استفاده می شود. برای اطلاعات بیشتر در مورد پشته های ساختمان،
اسناد زیر را
بررسی کنید
.
درایورهای کانال موجود
هر کانال ورود به سیستم توسط یک "درایور" تغذیه می شود. درایور تعیین می کند که پیام گزارش چگونه و کجا واقعاً ضبط شود. درایورهای کانال لاگ زیر در هر برنامه لاراول موجود است. ورودی بیشتر این درایورها از قبل در
config/logging.php
فایل پیکربندی برنامه شما وجود دارد، بنابراین حتماً این فایل را مرور کنید تا با محتویات آن آشنا شوید:
نام | شرح |
---|---|
custom |
درایوری که یک کارخانه مشخص را برای ایجاد یک کانال فراخوانی می کند |
daily |
یک
RotatingFileHandler
درایور مبتنی بر Monolog که روزانه می چرخد
|
errorlog |
یک
ErrorLogHandler
راننده مونولوگ مبتنی بر
|
monolog |
یک درایور کارخانه Monolog که ممکن است از هر کنترل کننده Monolog پشتیبانی شده استفاده کند |
papertrail |
یک
SyslogUdpHandler
درایور مبتنی بر Monolog
|
single |
یک کانال ثبت بر اساس فایل یا مسیر (
StreamHandler
)
|
slack |
یک
SlackWebhookHandler
درایور مبتنی بر Monolog
|
stack |
پوششی برای تسهیل ایجاد کانال های "چند کانال". |
syslog |
یک
SyslogHandler
درایور مبتنی بر Monolog
|
برای کسب اطلاعات بیشتر در مورد و درایورها ، اسناد مربوط به سفارشی سازی کانال پیشرفته را بررسی کنید .
monolog
custom
پیکربندی نام کانال
بهطور پیشفرض، Monolog با یک «نام کانال» که با محیط فعلی مطابقت دارد، مانند
production
یا
local
. برای تغییر این مقدار، میتوانید
name
گزینهای را به پیکربندی کانال خود اضافه کنید:
'stack' => [ 'driver' => 'stack', 'name' => 'channel-name', 'channels' => ['single', 'slack'],],
پیش نیاز کانال
پیکربندی کانال های تک و روزانه
کانال های
single
و
daily
دارای سه گزینه پیکربندی اختیاری هستند:
bubble
,
permission
و
locking
.
نام | شرح | پیش فرض |
---|---|---|
bubble |
نشان میدهد که آیا پیامها پس از مدیریت باید در کانالهای دیگر حباب شوند یا خیر | true |
locking |
سعی کنید قبل از نوشتن فایل log را قفل کنید | false |
permission |
مجوزهای فایل log | 0644 |
علاوه بر این، سیاست حفظ کانال را
daily
می توان از طریق
LOG_DAILY_DAYS
متغیر محیطی یا با تنظیم
days
گزینه پیکربندی پیکربندی کرد.
نام | شرح | پیش فرض |
---|---|---|
days |
تعداد روزهایی که فایل های گزارش روزانه باید حفظ شوند | 7 |
پیکربندی کانال Papertrail
کانال
به گزینه های پیکربندی
papertrail
نیاز دارد
. اینها ممکن است از طریق متغیرهای محیطی
و محیطی
تعریف شوند
. می توانید این مقادیر را از
Papertrail
بدست آورید .
host
port
PAPERTRAIL_URL
PAPERTRAIL_PORT
پیکربندی کانال Slack
کانال
slack
به یک
url
گزینه پیکربندی نیاز دارد. این مقدار ممکن است از طریق متغیر محیطی تعریف شود
LOG_SLACK_WEBHOOK_URL
. این نشانی اینترنتی باید با URL مربوط به
وب هوک ورودی
که برای تیم Slack خود پیکربندی کرده اید مطابقت داشته باشد.
critical
به طور پیشفرض، Slack فقط گزارشها را در سطح و بالاتر
دریافت میکند .
با این حال، میتوانید این را با استفاده از
LOG_LEVEL
متغیر محیطی یا با تغییر
level
گزینه پیکربندی در آرایه پیکربندی کانال Slack log خود تنظیم کنید.
اخطارهای انحراف گزارش
PHP، لاراول و سایر کتابخانه ها اغلب به کاربران خود اطلاع می دهند که برخی از ویژگی های آنها منسوخ شده است و در نسخه های بعدی حذف خواهند شد. اگر میخواهید این هشدارهای منسوخ شدن را ثبت کنید، میتوانید
deprecations
کانال گزارش دلخواه خود را با استفاده از متغیر محیطی یا در
فایل پیکربندی
LOG_DEPRECATIONS_CHANNEL
برنامه خود مشخص کنید:
config/logging.php
'deprecations' => [ 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), 'trace' => env('LOG_DEPRECATIONS_TRACE', false),], 'channels' => [ // ...]
یا ممکن است یک کانال گزارش با نام تعریف کنید
deprecations
. اگر یک کانال گزارش با این نام وجود داشته باشد، همیشه برای ثبت موارد منسوخ استفاده می شود:
'channels' => [ 'deprecations' => [ 'driver' => 'single', 'path' => storage_path('logs/php-deprecation-warnings.log'), ],],
ساخت پشته سیاهههای مربوط
همانطور که قبلا ذکر شد،
stack
درایور به شما امکان می دهد چندین کانال را در یک کانال ورود به سیستم برای راحتی ترکیب کنید. برای نشان دادن نحوه استفاده از پشتههای گزارش، اجازه دهید نگاهی به پیکربندی مثالی بیندازیم که ممکن است در یک برنامه تولیدی مشاهده کنید:
'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['syslog', 'slack'], 'ignore_exceptions' => false, ], 'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), 'replace_placeholders' => true, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 'level' => env('LOG_LEVEL', 'critical'), 'replace_placeholders' => true, ],],
بیایید این پیکربندی را تشریح کنیم. ابتدا توجه داشته باشید که
stack
کانال ما دو کانال دیگر را از طریق
channels
گزینه خود جمع می کند:
syslog
و
slack
. بنابراین، هنگام ثبت پیامها، هر دوی این کانالها امکان ثبت پیام را خواهند داشت. با این حال، همانطور که در زیر خواهیم دید، این که آیا این کانالها واقعاً پیام را ثبت میکنند یا خیر، ممکن است بر اساس شدت / «سطح» پیام تعیین شود.
سطوح ورود به سیستم
level
به گزینه پیکربندی موجود در پیکربندی کانال
syslog
و
slack
در مثال بالا
توجه کنید .
این گزینه حداقل "سطح" را تعیین می کند که یک پیام باید توسط کانال ثبت شود. Monolog که خدمات لاگ لاراول را تقویت می کند، تمام سطوح گزارش تعریف شده در
مشخصات RFC 5424
را ارائه می دهد . به ترتیب نزولی شدت، این سطوح گزارش عبارتند از:
اضطراری
،
هشدار
،
بحرانی
،
خطا
،
هشدار
،
اطلاعیه
،
اطلاعات
، و
اشکال زدایی
.
بنابراین، تصور کنید ما یک پیام را با استفاده از
debug
روش وارد می کنیم:
Log::debug('An informational message.');
با توجه به پیکربندی ما،
syslog
کانال پیام را به گزارش سیستم می نویسد. با این حال، از آنجایی که پیام خطا
critical
در بالا نیست، به Slack ارسال نخواهد شد. با این حال، اگر پیامی را وارد کنیم
emergency
، هم به سیستم گزارش و هم به Slack ارسال میشود، زیرا
emergency
سطح بالاتر از آستانه حداقل سطح ما برای هر دو کانال است:
Log::emergency('The system is down!');
نوشتن پیام های گزارش
می توانید با استفاده از نما اطلاعات را در سیاهههای مربوط
Log
بنویسید
. همانطور که قبلا ذکر شد، لاگر هشت سطح گزارش تعریف شده در
مشخصات RFC 5424
را ارائه می دهد :
اضطراری
،
هشدار
،
بحرانی
،
خطا
،
هشدار
،
اطلاعیه
،
اطلاعات
و
اشکال زدایی
:
use Illuminate\Support\Facades\Log; Log::emergency($message);Log::alert($message);Log::critical($message);Log::error($message);Log::warning($message);Log::notice($message);Log::info($message);Log::debug($message);
می توانید با هر یک از این روش ها پیامی را برای سطح مربوطه ثبت کنید. بهطور پیشفرض، پیام در کانال گزارش پیشفرض همانطور که توسط
logging
فایل پیکربندی شما پیکربندی شده است، نوشته میشود:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;use App\Models\User;use Illuminate\Support\Facades\Log;use Illuminate\View\View; class UserController extends Controller{ /** * Show the profile for the given user. */ public function show(string $id): View { Log::info('Showing the user profile for user: {id}', ['id' => $id]); return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}
اطلاعات متنی
آرایه ای از داده های متنی ممکن است به روش های log ارسال شود. این دادههای متنی با پیام گزارش قالببندی و نمایش داده میشوند:
use Illuminate\Support\Facades\Log; Log::info('User {id} failed to login.', ['id' => $user->id]);
گاهی اوقات، ممکن است بخواهید برخی از اطلاعات متنی را مشخص کنید که باید با تمام ورودی های گزارش بعدی در یک کانال خاص گنجانده شود. به عنوان مثال، ممکن است بخواهید شناسه درخواستی را وارد کنید که با هر درخواست ورودی به برنامه شما مرتبط است. برای انجام این کار، می توانید روش
Log
نما را فراخوانی کنید
withContext
:
<?php namespace App\Http\Middleware; use Closure;use Illuminate\Http\Request;use Illuminate\Support\Facades\Log;use Illuminate\Support\Str;use Symfony\Component\HttpFoundation\Response; class AssignRequestId{ /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { $requestId = (string) Str::uuid(); Log::withContext([ 'request-id' => $requestId ]); $response = $next($request); $response->headers->set('Request-Id', $requestId); return $response; }}
اگر میخواهید اطلاعات متنی را در
تمام
کانالهای گزارش به اشتراک بگذارید، میتوانید از
Log::shareContext()
روش استفاده کنید. این روش اطلاعات متنی را برای همه کانال های ایجاد شده و هر کانالی که متعاقبا ایجاد می شود ارائه می دهد:
<?php namespace App\Http\Middleware; use Closure;use Illuminate\Http\Request;use Illuminate\Support\Facades\Log;use Illuminate\Support\Str;use Symfony\Component\HttpFoundation\Response; class AssignRequestId{ /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { $requestId = (string) Str::uuid(); Log::shareContext([ 'request-id' => $requestId ]); // ... }}
اگر در حین پردازش مشاغل در صف نیاز به اشتراکگذاری زمینه گزارش دارید، میتوانید از میانافزار job استفاده کنید .
نوشتن در کانال های خاص
گاهی اوقات ممکن است بخواهید پیامی را به کانالی غیر از کانال پیش فرض برنامه خود وارد کنید. می توانید از
channel
روش روی
Log
نما برای بازیابی و ورود به هر کانالی که در فایل پیکربندی خود تعریف شده است استفاده کنید:
use Illuminate\Support\Facades\Log; Log::channel('slack')->info('Something happened!');
اگر میخواهید یک پشته گزارش بر اساس درخواست متشکل از چندین کانال ایجاد کنید، میتوانید از
stack
روش زیر استفاده کنید:
Log::stack(['single', 'slack'])->info('Something happened!');
کانال های درخواستی
همچنین می توان با ارائه پیکربندی در زمان اجرا، بدون اینکه آن پیکربندی در فایل پیکربندی برنامه شما وجود داشته باشد، یک کانال درخواستی ایجاد کرد
logging
. برای انجام این کار، می توانید یک آرایه پیکربندی را به روش
Log
نما ارسال کنید
build
:
use Illuminate\Support\Facades\Log; Log::build([ 'driver' => 'single', 'path' => storage_path('logs/custom.log'),])->info('Something happened!');
همچنین ممکن است بخواهید یک کانال بر اساس تقاضا را در یک پشته گزارش بر اساس تقاضا قرار دهید. این را می توان با گنجاندن نمونه کانال درخواستی خود در آرایه ارسال شده به
stack
متد به دست آورد:
use Illuminate\Support\Facades\Log; $channel = Log::build([ 'driver' => 'single', 'path' => storage_path('logs/custom.log'),]); Log::stack(['slack', $channel])->info('Something happened!');
سفارشی سازی کانال مونولوگ
سفارشی سازی Monolog برای کانال ها
گاهی اوقات ممکن است نیاز به کنترل کامل روی نحوه پیکربندی Monolog برای یک کانال موجود داشته باشید. برای مثال، ممکن است بخواهید یک
FormatterInterface
پیاده سازی سفارشی Monolog را برای کانال داخلی لاراول پیکربندی کنید
single
.
برای شروع، یک
tap
آرایه در پیکربندی کانال تعریف کنید. آرایه
tap
باید شامل فهرستی از کلاسها باشد که باید فرصتی برای سفارشیسازی (یا ضربه زدن به) نمونه Monolog پس از ایجاد آن داشته باشند. هیچ مکان متعارفی وجود ندارد که این کلاسها در آن قرار گیرند، بنابراین شما میتوانید یک دایرکتوری در برنامه خود ایجاد کنید که حاوی این کلاسها باشد:
'single' => [ 'driver' => 'single', 'tap' => [App\Logging\CustomizeFormatter::class], 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'replace_placeholders' => true,],
هنگامی که گزینه را در کانال خود پیکربندی کردید
tap
، آماده تعریف کلاسی هستید که نمونه Monolog شما را سفارشی می کند. این کلاس فقط به یک متد نیاز دارد:
__invoke
که یک
Illuminate\Log\Logger
نمونه را دریافت می کند. نمونه
Illuminate\Log\Logger
تمام فراخوانی های متد را به نمونه اصلی Monolog پراکسی می کند:
<?php namespace App\Logging; use Illuminate\Log\Logger;use Monolog\Formatter\LineFormatter; class CustomizeFormatter{ /** * Customize the given logger instance. */ public function __invoke(Logger $logger): void { foreach ($logger->getHandlers() as $handler) { $handler->setFormatter(new LineFormatter( '[%datetime%] %channel%.%level_name%: %message% %context% %extra%' )); } }}
همه کلاسهای "tap" شما توسط کانتینر سرویس حل میشوند ، بنابراین هر وابستگی سازنده که نیاز دارند به طور خودکار تزریق میشود.
ایجاد کانال های مونولوگ Handler
Monolog هندلرهای
متنوعی دارد
و لاراول برای هر کدام یک کانال داخلی در نظر نمی گیرد. در برخی موارد، ممکن است بخواهید یک کانال سفارشی ایجاد کنید که صرفاً نمونهای از یک کنترلر خاص Monolog است که دارای درایور لاگ لاراول مربوطه نیست. این کانال ها را می توان به راحتی با استفاده از
monolog
درایور ایجاد کرد.
هنگام استفاده از
monolog
درایور، از
handler
گزینه پیکربندی برای تعیین اینکه کدام handler نمونه سازی می شود استفاده می شود. به صورت اختیاری، هر پارامتر سازنده مورد نیاز هندلر ممکن است با استفاده از
with
گزینه پیکربندی مشخص شود:
'logentries' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\SyslogUdpHandler::class, 'with' => [ 'host' => 'my.logentries.internal.datahubhost.company.com', 'port' => '10000', ],],
قالبهای مونولوگ
هنگام استفاده از
monolog
درایور، Monolog
LineFormatter
به عنوان فرمت کننده پیش فرض استفاده می شود. با این حال، میتوانید با استفاده از گزینههای پیکربندی
formatter
و تنظیمات
، نوع قالبکننده ارسال شده به کنترلکننده را سفارشی کنید
formatter_with
:
'browser' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\BrowserConsoleHandler::class, 'formatter' => Monolog\Formatter\HtmlFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Y-m-d', ],],
اگر از یک کنترل کننده Monolog استفاده می کنید که قادر به ارائه فرمت کننده خود است، می توانید مقدار
formatter
گزینه پیکربندی را روی
default
:
'newrelic' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\NewRelicHandler::class, 'formatter' => 'default',],
پردازنده های مونولوگ
Monolog همچنین می تواند پیام ها را قبل از ورود به سیستم پردازش کند. شما می توانید پردازنده های خود را ایجاد کنید یا از پردازنده های موجود ارائه شده توسط Monolog استفاده کنید .
اگر میخواهید پردازندهها را برای یک
monolog
درایور سفارشی کنید، یک
processors
مقدار پیکربندی به پیکربندی کانال خود اضافه کنید:
'memory' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\StreamHandler::class, 'with' => [ 'stream' => 'php://stderr', ], 'processors' => [ // Simple syntax... Monolog\Processor\MemoryUsageProcessor::class, // With options... [ 'processor' => Monolog\Processor\PsrLogMessageProcessor::class, 'with' => ['removeUsedContextFields' => true], ], ],],
ایجاد کانال های سفارشی از طریق Factories
اگر می خواهید یک کانال کاملاً سفارشی تعریف کنید که در آن کنترل کاملی بر نمونه سازی و پیکربندی Monolog داشته باشید، می توانید یک نوع درایور را در
فایل پیکربندی
custom
خود مشخص کنید.
config/logging.php
پیکربندی شما باید شامل
via
گزینه ای باشد که حاوی نام کلاس کارخانه باشد که برای ایجاد نمونه Monolog فراخوانی می شود:
'channels' => [ 'example-custom-channel' => [ 'driver' => 'custom', 'via' => App\Logging\CreateCustomLogger::class, ],],
هنگامی که کانال درایور را پیکربندی کردید
custom
، آماده تعریف کلاسی هستید که نمونه Monolog شما را ایجاد می کند. این کلاس فقط به یک
__invoke
متد نیاز دارد که باید نمونه Logger Monolog را برگرداند. متد آرایه پیکربندی کانال ها را به عنوان تنها آرگومان خود دریافت می کند:
<?php namespace App\Logging; use Monolog\Logger; class CreateCustomLogger{ /** * Create a custom Monolog instance. */ public function __invoke(array $config): Logger { return new Logger(/* ... */); }}
دنبال کردن پیام های گزارش با استفاده از Pail
اغلب ممکن است لازم باشد لاگ های برنامه خود را در زمان واقعی دنبال کنید. به عنوان مثال، هنگام اشکال زدایی یک مشکل یا هنگام نظارت بر گزارش های برنامه خود برای انواع خاصی از خطاها.
Laravel Pail بسته ای است که به شما امکان می دهد به راحتی مستقیماً از خط فرمان وارد فایل های لاگ برنامه لاراول خود شوید. برخلاف دستور استاندارد
tail
، Pail برای کار با هر درایور لاگ از جمله Sentry یا Flare طراحی شده است. علاوه بر این، Pail مجموعه ای از فیلترهای مفید را برای کمک به شما در یافتن سریع آنچه به دنبال آن هستید ارائه می دهد.
نصب و راه اندازی
برای شروع، Pail را با استفاده از مدیریت بسته Composer در پروژه خود نصب کنید:
composer require laravel/pail
استفاده
برای شروع tailing log ها،
pail
دستور زیر را اجرا کنید:
php artisan pail
برای افزایش پرحرفی خروجی و جلوگیری از کوتاه شدن (...)، از
-v
گزینه استفاده کنید:
php artisan pail -v
برای حداکثر پرحرفی و نمایش ردپای پشته استثنایی، از
-vv
گزینه استفاده کنید:
php artisan pail -vv
برای توقف سیاهههای مربوط به دنباله،
Ctrl+C
هر زمان که بخواهید فشار دهید.
فیلتر کردن سیاههها
--filter
می توانید از
--filter
گزینه فیلتر کردن گزارش ها بر اساس نوع، فایل، پیام و محتوای ردیابی پشته استفاده کنید:
php artisan pail --filter="QueryException"
--message
برای فیلتر کردن گزارشها فقط بر اساس پیام آنها، میتوانید از این
--message
گزینه استفاده کنید:
php artisan pail --message="User created"
--level
این
--level
گزینه ممکن است برای فیلتر کردن گزارش ها بر اساس
سطح گزارش
آنها استفاده شود :
php artisan pail --level=error
--user
فقط برای نمایش گزارشهایی که در زمانی که یک کاربر مشخص شده است نوشته شدهاند، میتوانید شناسه کاربر را برای این
--user
گزینه ارائه کنید:
php artisan pail --user=1