
Fungsionalitas logging bawaan Laravel adalah salah satu fiturnya yang sangat menyenangkan. Ini bisa menjadi keuntungan nyata jika kami mencoba memecahkan masalah dalam produksi, karena kami dapat mencatat informasi tentang proses yang berjalan dengan aman tanpa harus khawatir hal itu akan memengaruhi pengguna kami. Kelemahannya adalah jika kita memiliki banyak permintaan secara bersamaan, kita akan kesulitan memahaminya, namun untungnya ada cara untuk mengatasi hal ini.
Pada artikel ini kita akan membahas cara menggunakan Log Facade Laravel untuk menyelesaikan masalah aplikasi.
Pengantar Pencatatan Laravel
Laravel menyediakan Illuminate\Support\Facades\Log
Bantu kami mencatat informasi dalam permintaan. Salah satu fitur paling dasar yang disediakan oleh Log Facade adalah beberapa fungsi statis yang menyediakan tingkat logging berbeda.
Kita dapat menggunakan ini untuk mengekspresikan tingkat “ketertarikan” yang berbeda-beda pada hal apa pun yang menarik, sehingga pertanyaan tingkat mendesak yang memerlukan perhatian segera mungkin akan muncul ke atas, sementara pertanyaan yang bersifat informasi atau debugging mungkin tidak akan pernah dilihat.
use Illuminate\Support\Facades\Log;
$message="test";
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
Secara default, Laravel menyimpan data log di “storage/logs/laravel.log”. Jika kita menjalankan fungsi di atas, kita akan mendapatkan output sebagai berikut. Seperti yang Anda lihat, fungsi statis di setiap level sebenarnya hanya memengaruhi teks pada baris logging. Kita dapat menggunakan ini nanti untuk menyaring informasi spesifik yang ingin kita lihat.
[2024-11-25 00:35:17] local.EMERGENCY: test
[2024-11-25 00:35:17] local.ALERT: test
[2024-11-25 00:35:17] local.CRITICAL: test
[2024-11-25 00:35:17] local.ERROR: test
[2024-11-25 00:35:17] local.WARNING: test
[2024-11-25 00:35:17] local.NOTICE: test
[2024-11-25 00:35:17] local.INFO: test
[2024-11-25 00:35:17] local.DEBUG: test
Sebagai bagian dari fungsi logging bawaan, kami juga dapat mencatat informasi tentang permintaan yang akan ditambahkan ke baris log sehingga kami dapat meninjaunya. Misalnya, jika kita ingin menampilkan ID pengguna, kita bisa melakukan ini.
use Illuminate\Support\Facades\Log;
Log::info('User access denied', ['id' => $user->id]);
// output
// [2024-11-25 00:36:09] local.INFO: User access denied {"id":42}
penyimpanan
Fungsionalitas logging Laravel sangat sederhana, namun juga memungkinkan banyak kontrol atas ke mana kita mengirim informasi login.
Laravel menggunakan kelas yang disebut driver yang memungkinkan kita menentukan di mana log disimpan. Laravel mendukung logging ke file, server syslog, dan bahkan Slack menggunakan driver yang disertakan dengan pengaturan default. Kami juga dapat menambahkan driver pihak ketiga untuk masuk ke solusi lain.
Kita dapat mengkonfigurasi driver default dengan mengedit “config/logging.php”. Barisnya ditunjukkan di bawah ini.
'default' => env('LOG_CHANNEL', 'stack'),
Kami kemudian dapat menentukan berbagai saluran menggunakan tombol “saluran”. Item berikut adalah item default.
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'replace_placeholders' => true,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => env('LOG_LEVEL', 'critical'),
'replace_placeholders' => true,
],
'papertrail' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
],
'processors' => [PsrLogMessageProcessor::class],
],
'stderr' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
'processors' => [PsrLogMessageProcessor::class],
],
'syslog' => [
'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'),
'facility' => LOG_USER,
'replace_placeholders' => true,
],
'errorlog' => [
'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
Gunakan pipa alternatif
Sekarang Anda mungkin bertanya pada diri sendiri, “Bagaimana cara menggunakan saluran pipa alternatif ini?”. Solusinya sesederhana mengatur saluran saat kita merekam pesan.
Log::channel('daily')->info('This goes into a file with the date');
Saluran harian menggunakan driver harian, sehingga entri yang kita catat sebenarnya berakhir di direktori “storage/logs/” dengan nama arsip berdasarkan tanggal entri tersebut dicatat. Misalnya saat saya menulis artikel ini, datanya disimpan di “storage/logs/laravel-2024-11-25.log”.
Kami lebih suka menggunakan driver “harian” sebagai default dalam produksi karena secara otomatis memutar file setelah beberapa hari tertentu, jadi kami tidak memiliki file log berukuran puluhan atau ratusan GB (dari pengalaman pribadi).
Buat saluran kami sendiri
Cara yang baik untuk memecahkan masalah dalam produksi adalah dengan menyiapkan saluran kami sendiri sehingga kami mencatat informasi tentang masalah/situasi tertentu ke dalam file lognya sendiri untuk memudahkan pemecahan masalah.
Kita dapat membuat saluran secara dinamis dalam kode kita.
catatan::membangun([
‘driver’ => ‘single’,
‘path’ => storage_path(“logs/user-{$user->id}.log”),
])->info(‘Masuk’);
Kami juga dapat menambahkan saluran khusus ke konfigurasi.
“Saluran” => [
// ..
‘custom-channel’ => [
‘driver’ => ‘daily’,
‘path’ => storage_path(‘logs/custom-channel.log’),
‘level’ => ‘debug’,
‘days’ => 14,
],
],
Log::channel('custom-channel')
->info('This goes into custom-channel');
Gunakan log untuk men-debug masalah
Sekarang setelah kita memahami dasar-dasarnya, kita dapat menggunakan log untuk memecahkan masalah.
Cara paling sederhana adalah dengan menggunakan tail
Perintah untuk melihat file log.
tail -f storage/logs/laravel.log
Kemudian, ketika item tersebut masuk ke sistem kami, item tersebut akan muncul di terminal untuk kami lihat.
Salah satu kelemahan cara kerja sistem logging adalah secara default semua permintaan tercampur menjadi satu. Kami dapat mencatat ID pengguna pada setiap permintaan, namun hal ini dapat menjadi sangat berantakan. Untungnya, Laravel memungkinkan kita menentukan informasi yang dicatat pada setiap permintaan log menggunakan: Log::withContext()
Fungsi.
Solusi favorit kami adalah membuat UUID untuk permintaan tersebut dan kemudian mengaturnya di penyedia layanan.
// in a service provider
$uuid = (string) Str::uuid();
Log::withContext([
'uuid' => $uuid,
]);
Kami kemudian dapat menggunakan panggilan logging kami secara normal.
// in our application
Log::info('User attempted to login');
Log::info('Password checked');
Log::info('User access denied');
Kemudian, di log kita, uuid kita akan muncul di setiap baris.
[2024-11-25 00:39:26] local.INFO: User attempted to login {"uuid":"d9770a55-2019-4095-92e5-66b097c387fb"}
[2024-11-25 00:39:26] local.INFO: User attempted to login {"uuid":"3d3e3769-a4a2-417b-a278-d3a1b80837d1"}
[2024-11-25 00:39:26] local.INFO: Password checked {"uuid":"d9770a55-2019-4095-92e5-66b097c387fb"}
[2024-11-25 00:39:26] local.INFO: User access denied {"uuid":"d9770a55-2019-4095-92e5-66b097c387fb"}
[2024-11-25 00:39:26] local.INFO: Password checked {"uuid":"3d3e3769-a4a2-417b-a278-d3a1b80837d1"}
[2024-11-25 00:39:26] local.INFO: User access denied {"uuid":"3d3e3769-a4a2-417b-a278-d3a1b80837d1"}
Kami kemudian dapat menggunakan grep untuk menemukan entri yang diminta.
$ grep "d9770a55-2019-4095-92e5-66b097c387fb" storage/logs/laravel.log
[2024-11-25 00:39:26] local.INFO: User attempted to login {"uuid":"d9770a55-2019-4095-92e5-66b097c387fb"}
[2024-11-25 00:39:26] local.INFO: Password checked {"uuid":"d9770a55-2019-4095-92e5-66b097c387fb"}
[2024-11-25 00:39:26] local.INFO: User access denied {"uuid":"d9770a55-2019-4095-92e5-66b097c387fb"}
Proses ini sangat berguna karena Anda dapat membuat UUID untuk setiap permintaan dan menampilkannya di halaman kesalahan aplikasi Anda. Saat pengguna melaporkan masalah, mereka dapat dengan cepat mencari hasilnya.
apa yang perlu Anda ketahui
- Laravel hadir dengan tampilan dan nuansa logging yang berfungsi penuh
- Kita dapat menggunakannya untuk memecahkan masalah produksi
- Gunakan tail dan grep untuk mempersempit apa yang kita cari