نسخه:

ورود به سیستم

معرفی

برای کمک به کسب اطلاعات بیشتر در مورد آنچه در برنامه شما اتفاق می افتد، لاراول خدمات گزارش گیری قوی ارائه می دهد که به شما امکان می دهد پیام ها را در فایل ها، گزارش خطای سیستم و حتی به 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(...);
}
}