ورود به سیستم
معرفی
برای کمک به کسب اطلاعات بیشتر در مورد آنچه در برنامه شما اتفاق می افتد، لاراول خدمات گزارش گیری قوی ارائه می دهد که به شما امکان می دهد پیام ها را در فایل ها، گزارش خطای سیستم و حتی به Slack ثبت کنید تا به کل تیم خود اطلاع دهید.
لاراول در زیر هود از کتابخانه Monolog استفاده می کند که از انواع کنترل کننده های لاگ قدرتمند پشتیبانی می کند. لاراول پیکربندی این دستهها را سخت میکند و به شما این امکان را میدهد که آنها را ترکیب و مطابقت دهید تا مدیریت گزارش برنامه خود را سفارشی کنید.
پیکربندی
تمام پیکربندی سیستم لاگ برنامه شما در
config/logging.php
فایل پیکربندی قرار دارد.
این فایل به شما امکان می دهد کانال های گزارش برنامه خود را پیکربندی کنید،
بنابراین حتماً هر یک از کانال های موجود و گزینه های آنها را بررسی کنید.
در زیر چند گزینه رایج را بررسی خواهیم کرد.
به طور پیش فرض، لاراول از
stack
کانال هنگام ثبت پیام ها استفاده می کند.
این
stack
کانال برای جمع آوری چندین کانال ورود به سیستم در یک کانال واحد استفاده می
شود.
برای اطلاعات بیشتر در مورد پشته های ساختمان، اسناد زیر را
بررسی کنید
.
پیکربندی نام کانال
بهطور پیشفرض، Monolog با یک «نام کانال» که با محیط فعلی مطابقت دارد،
مانند
production
یا
local
.
برای تغییر این مقدار، یک
name
گزینه به پیکربندی کانال خود اضافه کنید:
'stack' => [ 'driver' => 'stack', 'name' => 'channel-name', 'channels' => ['single', 'slack'],],
درایورهای کانال موجود
نام | شرح |
---|---|
stack |
پوششی برای تسهیل ایجاد کانال های "چند کانال". |
single |
یک کانال ثبت بر اساس فایل یا مسیر (
StreamHandler
)
|
daily |
یک
RotatingFileHandler
درایور مبتنی بر Monolog که روزانه می چرخد
|
slack |
یک
SlackWebhookHandler
درایور مبتنی بر Monolog
|
papertrail |
یک
SyslogUdpHandler
درایور مبتنی بر Monolog
|
syslog |
یک
SyslogHandler
درایور مبتنی بر Monolog
|
errorlog |
یک
ErrorLogHandler
درایور مبتنی بر Monolog
|
monolog |
یک درایور کارخانه Monolog که ممکن است از هر کنترل کننده Monolog پشتیبانی شده استفاده کند |
custom |
درایوری که یک کارخانه مشخص را برای ایجاد یک کانال فراخوانی می کند |
برای کسب اطلاعات بیشتر در مورد و درایورها ، اسناد مربوط به سفارشی سازی کانال پیشرفته را بررسی کنید .
monolog
custom
پیکربندی کانال های تک و روزانه
کانال های
single
و
daily
دارای سه گزینه پیکربندی اختیاری هستند:
bubble
,
permission
و
locking
.
نام | شرح | پیش فرض |
---|---|---|
bubble |
نشان میدهد که آیا پیامها پس از مدیریت باید در کانالهای دیگر حباب شوند یا خیر | true |
permission |
مجوزهای فایل log | 0644 |
locking |
سعی کنید قبل از نوشتن فایل log را قفل کنید | false |
پیکربندی کانال Papertrail
کانال به گزینه های پیکربندی
و پیکربندی
papertrail
نیاز دارد
.
می توانید این مقادیر را از
Papertrail
بدست آورید .
url
port
پیکربندی کانال Slack
کانال
slack
به یک
url
گزینه پیکربندی نیاز دارد.
این نشانی اینترنتی باید با URL مربوط به
وب هوک ورودی
که برای تیم Slack خود پیکربندی کرده اید مطابقت داشته باشد.
critical
به طور پیشفرض، Slack فقط گزارشها را در سطح و بالاتر
دریافت میکند .
با این حال، شما می توانید این را در
logging
فایل پیکربندی خود تنظیم کنید.
ساخت پشته سیاهههای مربوط
همانطور که قبلا ذکر شد،
stack
درایور به شما امکان می دهد چندین کانال را در یک کانال ورود به سیستم ترکیب
کنید.
برای نشان دادن نحوه استفاده از پشتههای گزارش، اجازه دهید نگاهی به
پیکربندی مثالی بیندازیم که ممکن است در یک برنامه تولیدی مشاهده کنید:
'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['syslog', 'slack'], ], 'syslog' => [ 'driver' => 'syslog', 'level' => 'debug', ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ],],
بیایید این پیکربندی را تشریح کنیم.
ابتدا توجه داشته باشید که
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
را ارائه می دهد :
اضطراری
،
هشدار
،
بحرانی
،
خطا
،
هشدار
،
اطلاعیه
،
اطلاعات
و
اشکال زدایی
:
Log::emergency($message);Log::alert($message);Log::critical($message);Log::error($message);Log::warning($message);Log::notice($message);Log::info($message);Log::debug($message);
بنابراین، میتوانید هر یک از این روشها را برای ثبت پیام برای سطح مربوطه
فراخوانی کنید.
بهطور پیشفرض، پیام در کانال گزارش پیشفرض همانطور که توسط
config/logging.php
فایل پیکربندی شما پیکربندی شده است، نوشته میشود:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;use App\User;use Illuminate\Support\Facades\Log; class UserController extends Controller{ /** * Show the profile for the given user. * * @param int $id * @return Response */ public function showProfile($id) { Log::info('Showing user profile for user: '.$id); return view('user.profile', ['user' => User::findOrFail($id)]); }}
اطلاعات متنی
آرایهای از دادههای متنی نیز ممکن است به روشهای گزارش ارسال شود. این دادههای متنی با پیام گزارش قالببندی و نمایش داده میشوند:
Log::info('User failed to login.', ['id' => $user->id]);
نوشتن در کانال های خاص
گاهی اوقات ممکن است بخواهید پیامی را به کانالی غیر از کانال پیش فرض
برنامه خود وارد کنید.
می توانید از
channel
روش روی
Log
نما برای بازیابی و ورود به هر کانالی که در فایل پیکربندی خود تعریف شده
است استفاده کنید:
Log::channel('slack')->info('Something happened!');
اگر میخواهید یک پشته گزارش بر اساس درخواست متشکل از چندین کانال ایجاد
کنید، میتوانید از
stack
روش زیر استفاده کنید:
Log::stack(['single', 'slack'])->info('Something happened!');
سفارشی سازی پیشرفته کانال Monolog
سفارشی سازی Monolog برای کانال ها
گاهی اوقات ممکن است نیاز به کنترل کامل روی نحوه پیکربندی Monolog برای یک
کانال موجود داشته باشید.
به عنوان مثال، ممکن است بخواهید یک
FormatterInterface
پیاده سازی سفارشی Monolog را برای کنترل کننده های یک کانال مشخص پیکربندی
کنید.
برای شروع، یک
tap
آرایه در پیکربندی کانال تعریف کنید.
آرایه
tap
باید حاوی لیستی از کلاسها باشد که پس از ایجاد نمونه Monolog باید فرصتی
برای سفارشی کردن (یا "تپ کردن" به آن) داشته باشند:
'single' => [ 'driver' => 'single', 'tap' => [App\Logging\CustomizeFormatter::class], 'path' => storage_path('logs/laravel.log'), 'level' => 'debug',],
هنگامی که گزینه را در کانال خود پیکربندی کردید
tap
، آماده تعریف کلاسی هستید که نمونه Monolog شما را سفارشی می کند.
این کلاس فقط به یک متد نیاز دارد:
__invoke
که یک
Illuminate\Log\Logger
نمونه را دریافت می کند.
نمونه
Illuminate\Log\Logger
تمام فراخوانی های متد را به نمونه اصلی Monolog پراکسی می کند:
<?php namespace App\Logging; use Monolog\Formatter\LineFormatter; class CustomizeFormatter{ /** * Customize the given logger instance. * * @param \Illuminate\Log\Logger $logger * @return void */ public function __invoke($logger) { 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 داشته باشید، می توانید یک نوع درایور را در
فایل پیکربندی
custom
خود مشخص کنید.
config/logging.php
پیکربندی شما باید شامل
via
گزینه ای برای اشاره به کلاس کارخانه باشد که برای ایجاد نمونه Monolog
فراخوانی می شود:
'channels' => [ 'custom' => [ 'driver' => 'custom', 'via' => App\Logging\CreateCustomLogger::class, ],],
هنگامی که کانال را پیکربندی کردید
custom
، آماده تعریف کلاسی هستید که نمونه Monolog شما را ایجاد می کند.
این کلاس فقط به یک متد نیاز دارد:
__invoke
, که باید نمونه Monolog را برگرداند:
<?php namespace App\Logging; use Monolog\Logger; class CreateCustomLogger{ /** * Create a custom Monolog instance. * * @param array $config * @return \Monolog\Logger */ public function __invoke(array $config) { return new Logger(...); }}