Logging Laravel: Semua yang Perlu Anda Ketahui

Diterbitkan: 2022-08-19

Saat mengembangkan aplikasi modern, pencatatan harus berada di urutan teratas daftar prioritas.

Logging menyediakan cara untuk memvisualisasikan aplikasi Anda dalam pengembangan dan produksi, memungkinkan transparansi dan visibilitas. Dengan logging yang terstruktur dengan baik, aplikasi modern dapat menjadi lebih mudah dirawat karena kami dapat secara proaktif mengidentifikasi titik kegagalan dan hambatan kinerja di aplikasi kami.

Kerangka kerja Laravel hadir dengan sistem logging yang kuat yang menangani semua rintangan yang terlibat dalam mengonfigurasi sistem logging yang terstruktur dengan benar di luar kotak. Sistem logging baru yang diperkenalkan di Laravel 6.5 ini sangat kuat, dan kami akan menjelajahinya di artikel ini.

Artikel ini akan mengeksplorasi dasar-dasar logging Laravel dan mengapa Anda harus menggunakan logging Laravel di proyek Anda berikutnya. Kami akan membahas logging terstruktur dan logging terpusat secara rinci. Selain itu, kita akan belajar bagaimana mengimplementasikan logging Laravel dengan membangun aplikasi Todo.

Anda akan mendapatkan lebih banyak dari artikel ini jika Anda sudah memiliki yang berikut di bawah ikat pinggang Anda:

  • Pengetahuan yang baik tentang pengembangan web
  • Pemahaman dasar tentang Laravel
  • Membangun aplikasi dengan Laravel

Apa itu Logging Laravel?

Logging Laravel adalah tentang bagaimana Laravel menangani logging, atau pelaporan masalah otomatis, menggunakan sistem logging PHP viral yang disebut Monolog. Namun, karena filosofi Laravel menggunakan pustaka populer yang ada untuk mengimplementasikan fitur kerangka kerja yang berbeda, Laravel menggunakan Monolog untuk semua kebutuhan pencatatannya.

Monolog adalah pustaka logging PHP yang sangat fleksibel dan populer yang dapat kami konfigurasikan untuk mengirim log Anda ke file, soket, database, dan layanan web lainnya. Monolog menyediakan antarmuka yang familier untuk menulis log dari file teks standar hingga layanan manajemen log pihak ketiga tingkat lanjut. Laravel biasanya menyiapkan Monolog untuk menggunakan file konfigurasi logging standar.

Untuk informasi lebih lanjut tentang Monolog dan fitur-fiturnya, lihat dokumentasi resmi, karena itu di luar cakupan artikel ini.

Sebelum kita masuk ke dalam mengonfigurasi dan mengimplementasikan logging Laravel menggunakan Monolog, mari kita jelajahi lebih banyak alasan untuk menggunakan logging Laravel dan jenis-jenisnya yang berbeda.

Mengapa Menggunakan Laravel Logging?

Mengapa logging diperlukan?

Manifesto Aplikasi Dua Belas Faktor memperlakukan logging sebagai salah satu perhatian kritis dari aplikasi modern, karena logging adalah kunci untuk kinerja dan pemantauan.

Log membantu dalam pemahaman terperinci tentang kesalahan yang terjadi dalam produksi dan dari mana asalnya. Selain itu, dengan struktur log yang tepat, ini dapat menunjukkan kepada pengguna tertentu, tindakan yang menyebabkan kesalahan, dan solusi yang mungkin untuk perbaikan dan pemeliharaan bug yang lebih cepat.

Logging terstruktur adalah penyelamat dalam aplikasi produksi dengan membantu memecahkan masalah cacat dan memecahkan masalah dalam produksi. Selain itu, Anda dapat memantau dan mengumpulkan semua pesan log Anda secara real-time menggunakan alat logging khusus untuk analisis dan pelaporan langsung.

Untuk alasan ini, Anda perlu menjadikan logging terstruktur sebagai prioritas utama dalam proyek aplikasi modern Anda berikutnya.

Mari kita lihat ikhtisar dari berbagai gaya logging yang tersedia.

Dasar-dasar Logging Laravel

Mempelajari dasar-dasar logging akan membantu Anda memahami bagaimana Laravel menangani logging dan bagaimana Anda dapat meningkatkan praktik logging terstruktur Anda.

Mari kita periksa dua konsep penting dalam logging untuk memahami lebih baik bagaimana menerapkan prosedur logging kita.

Logging Terstruktur Laravel

Dalam pengembangan perangkat lunak, logging terstruktur menerapkan format pesan yang telah ditentukan dan konsisten untuk log aplikasi. Format ini memungkinkan pesan diperlakukan sebagai data yang dapat dipantau, dimanipulasi, dan divisualisasikan jauh lebih baik daripada format teks biasa.

Anda harus menerapkan pendekatan logging terstruktur dalam pengembangan aplikasi modern Anda karena file log adalah aset penting bagi pengembang ketika sesuatu yang salah terjadi pada aplikasi Anda dalam produksi.

Karena Laravel menggunakan Monolog, pengembang dapat dengan cepat menerapkan logging terstruktur dengan mengonfigurasi logger untuk menerima jenis informasi tertentu, menyimpan file log dalam format yang berbeda, dan mengirimkan log ke berbagai layanan manajemen log pihak ketiga untuk visualisasi.

Logging Terpusat Laravel

Sistem logging terpusat adalah tempat log dikirim ke solusi Centralized Log Management (CLM) dari berbagai sumber untuk memudahkan konsolidasi dan visualisasi. Namun, CLM adalah solusi pencatat khusus yang mengumpulkan pesan log dari berbagai sumber dan menggabungkan data untuk pemrosesan dan visualisasi yang mudah.

Selain pengumpulan data, CLM juga diharapkan dapat mendukung analisis data log dan penyajian data yang jelas setelah analisis.

Logging Terstruktur vs Logging Dasar

Mari kita periksa perbedaan antara logging terstruktur dan logging dasar (tidak terstruktur) dan mengapa Anda harus menggunakan logging terstruktur dalam proyek Laravel Anda.

Pencatatan Dasar

Dalam logging dasar, file log disimpan dalam format mentah dengan data terbatas untuk query dan mengidentifikasi log individu.

Saat menggunakan logging Dasar, pengembang tidak akan dapat menggunakan alat analitik pihak ketiga untuk membaca, melihat, dan menganalisis log kecuali mereka mengembangkan alat khusus atau tetap menggunakan alat terbatas yang mendukung format log mereka.

Ada tiga alasan besar untuk menghindari penggunaan logging dasar:

  1. Sistem manajemen log terpusat tidak dapat bekerja dengan data tanpa dukungan tambahan.
  2. Solusi yang disesuaikan diperlukan untuk membaca dan mengurai data dari solusi logging dasar.
  3. Mungkin sulit bagi administrator untuk membaca data logging dasar karena masih mentah dan tidak terstruktur.

Pencatatan Terstruktur

Logging terstruktur menghemat waktu pengembang dengan menggunakan alat analisis log pihak ketiga open-source yang mendukung struktur log standar untuk membaca, melihat, dan menganalisis log.

Log sangat membantu jika berisi data yang benar yang tercantum di bawah ini, yang ingin dicapai oleh logging terstruktur. Kami dapat menggunakan data yang disertakan dalam logging terstruktur untuk membuat dasbor, grafik, bagan, dan visualisasi bermanfaat lainnya untuk menentukan kesehatan aplikasi.

Ini adalah contoh dasar informasi yang dapat kami sertakan dalam pesan log terstruktur. Selain itu, Anda dapat sepenuhnya menyesuaikan data sesuai dengan kebutuhan Anda.

Berikut adalah beberapa contoh data yang dapat Anda kumpulkan dengan logging terstruktur:

  1. Port yang digunakan untuk menjalankan fungsi
  2. Tanggal dan waktu peristiwa itu terjadi
  3. Nama pengguna atau ID pelanggan
  4. Deskripsi acara (pesan log)
  5. Protokol yang digunakan untuk menjalankan fungsi
  6. Lokasi peristiwa yang dipicu (menunjukkan API atau aplikasi yang sedang berjalan)
  7. ID acara unik
  8. Jenis tindakan yang dipicu (level log)

Log harus berisi data yang cukup untuk memvisualisasikan solusi atau alasan peristiwa log dengan mudah. Juga, perhatikan bahwa Anda tidak boleh menyimpan semua jenis informasi, seperti kata sandi atau data sensitif dalam log.

Sekarang setelah kita melihat sekilas apa itu Laravel logging, mari kita beralih ke implementasi Laravel logging dengan membangun aplikasi dengan logging sebagai warga negara kelas satu.

Cara Menerapkan Logging Laravel Dengan Aplikasi Todo

Sekarang kita akan menerapkan apa yang telah kita pelajari sejauh ini dengan membuat proyek Laravel baru dan mengimplementasikan logging Laravel.

Jika Anda belum pernah menggunakan Laravel sebelumnya, Anda dapat membaca apa itu Laravel atau mengintip daftar tutorial Laravel kami yang luar biasa untuk memulai.

Menyiapkan Laravel

Pertama, kita akan membuat instance Laravel baru menggunakan perintah di bawah ini. Anda dapat mencari dokumentasi resmi untuk lebih lanjut.

Buka konsol Anda dan navigasikan ke tempat Anda menyimpan proyek PHP Anda sebelum menjalankan perintah di bawah ini. Pastikan Komposer telah terinstal dan terkonfigurasi dengan benar.

 composer create-project laravel/laravel laravel-logging-app cd laravel-logging-app // Change directory to current Laravel installation php artisan serve // Start Laravel development server

Mengonfigurasi dan Menyemai Basis Data

Selanjutnya, kami akan menyiapkan database kami, membuat model Todo baru, dan menyemai 200 data palsu untuk pengujian.

Buka klien database Anda dan buat database baru. Kami akan melakukan hal yang sama dengan nama laravel_logging_app_db dan kemudian mengisi file .env kami dengan kredensial database:

 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_logging_app_db DB_USERNAME=//DB USERNAME HERE DB_PASSWORD=//DB PASSWORD HERE

Selanjutnya, kita akan menjalankan perintah berikut untuk membuat migrasi dan model Todo secara bersamaan:

 php artisan make:model Todo -mc

Buka database/migrations/xxx-create-todos-xxx.php yang baru dibuat dan rekatkan kode berikut:

 <?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateTodosTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('todos', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('description')->nullable(); $table->boolean('is_completed')->default(false); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('todos'); } }

Anda dapat melakukan seed todos Anda dengan data faker dengan mempelajari seed database Anda di Laravel menggunakan Faker.

Berjuang dengan downtime dan masalah WordPress? Kinsta adalah solusi hosting yang dirancang untuk menghemat waktu Anda! Lihat fitur kami

Sekilas tentang Monolog

Dengan Laravel Monolog, Anda dapat melakukan streaming dan mengirim log terstruktur ke berbagai saluran seperti email, Slack, file, soket, kotak masuk, database, dan berbagai layanan web. Di Laravel, Anda dapat mengonfigurasi logging dari satu file konfigurasi yang terletak di config/logging.php .

File konfigurasi dilengkapi dengan driver log yang telah ditentukan untuk dipilih, dan driver default adalah stack yang menggunakan saluran single untuk masuk ke file laravel.log yang ditemukan di folder penyimpanan/log . Kami akan mendemonstrasikan logging terstruktur dengan menggunakan beberapa driver log Laravel.

Laravel menyediakan beberapa metode untuk berinteraksi dengan Log, seperti yang ditunjukkan secara umum dalam file pengontrol TodosController.php segera.

Menulis Pesan Log di Pengontrol

Buka file pengontrol TodosController.php yang baru dibuat yang ditemukan folder app/Http/Controllers dan rekatkan kode berikut:

 <?php namespace AppHttpControllers; use AppModelsTodo; use IlluminateHttpRequest; use AppHttpControllersController; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesLog; class TodosController extends Controller { public function index(Request $request) { $todos = Todo::all(); Log::warning('User is accessing all the Todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function byUserId(Request $request) { $todos = Todo::where('user_id', Auth::user()->id)->get(); Log::info('User is accessing all his todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function show(Request $request, $id) { $todo = Todo::find($id); Log::info('User is accessing a single todo', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show')->with(['todo' => $todo]); } public function update(Request $request, $id) { # Validations before updating $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); Log::warning('Todo found for updating by user', ['user' => Auth::user()->id, 'todo' => $todo]); if ($todo) { $todo->title = $request->title; $todo->desc = $request->desc; $todo->status = $request->status == 'on' ? 1 : 0; if ($todo->save()) { Log::info('Todo updated by user successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be updated caused by invalid todo data', ['user' => Auth::user()->id, 'todo' => $todo->id, 'data' => $request->except('password')]); return; // 422 } Log::error('Todo not found by user', ['user' => Auth::user()->id, 'todo' => $id]); return; // 401 } public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 } public function delete(Request $request, $id) { Log::warning('User is trying to delete a single todo', ['user' => Auth::user()->id, 'todo' => $id]); $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); if ($todo) { Log::info('User deleted a single todo successfully', ['user' => Auth::user()->id, 'todo' => $id]); $todo->delete(); return view('index'); } Log::error('Todo not found by user for deleting', ['user' => Auth::user()->id, 'todo' => $id]); return; // 404 } }

Dalam setiap metode di TodoController , kami menambahkan fasad Log dengan level log tertentu untuk menentukan jenis kesalahan yang ingin kami kirim. Di bawah ini adalah contoh penggunaan

Log fasad dalam metode store .

 public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 }

Memformat Pesan Log

Misalkan Anda tidak nyaman dengan LineFormatter default yang digunakan oleh Laravel, yang berfungsi dengan baik dalam menyediakan pesan yang dapat dibaca dan bermanfaat.

Dalam hal ini, Anda dapat dengan mudah memutar objek formatter yang disesuaikan agar sesuai dengan kasus penggunaan Anda dan menggunakannya di seluruh aplikasi.

Dokumentasi Monolog resmi memberikan daftar lengkap formatter yang tersedia dan dapat dengan mudah membuat format khusus.

Di Laravel, Anda dapat dengan mudah mengatur driver apa pun untuk menggunakan formatter khusus Anda dengan menambahkannya ke daftar seperti di bawah ini di dalam file konfigurasi yang terletak di config/logging.php :

 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, 'formatter' => MonologFormatterHtmlFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Ym-d', ] ],

Contoh di atas menambahkan MonologFormatterHtmlFormatter kustom ke driver daily menggunakan kunci formatter dan formatter_with dalam konfigurasi saluran daily untuk mengubah format tanggal.

Mengirim Log ke Saluran Berbeda

Dengan bantuan Monolog, Laravel dapat mengirim log ke saluran yang berbeda dan beberapa saluran secara bersamaan.

Mari kita tunjukkan cara mengirim log ke saluran Slack kami dengan mengikuti langkah-langkah sederhana ini. Ubah saluran log default ke Slack dan tambahkan URL Webhook Slack di file .env Anda.

 LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here

Selanjutnya, uji konfigurasi Anda dengan mencatat pesan di aplikasi Anda menggunakan fasad Log seperti yang ditunjukkan di bawah ini:

 Log::debug("The API instance is on fire caused by:", ['user' => 1])

Anda dapat membuka saluran Slack Anda untuk memeriksa kesalahan yang dicetak di saluran yang diinginkan yang Anda tentukan saat membuat URL Webhook.

Ringkasan

Logging sama pentingnya dengan faktor lain dari aplikasi Anda, jika tidak lebih. Itulah mengapa disarankan oleh manifesto Aplikasi Dua Belas Faktor sebagai salah satu perhatian paling kritis dari aplikasi modern mana pun.

Dengan pencatatan yang efektif, Anda dapat dengan mudah membaca, melihat, dan memvisualisasikan kesalahan dan cacat yang terjadi pada aplikasi siap produksi Anda. Untuk itu, penting bagi Anda untuk menerapkan logging terstruktur ke dalam aplikasi Anda sejak awal proyek.

Dalam artikel ini, kami telah menjelajahi logging Laravel dan mengapa Anda harus menggunakannya di proyek Anda berikutnya. Kami membahas baik logging terstruktur dan logging terpusat secara rinci. Selain itu, kami mempelajari cara mengimplementasikan logging Laravel dengan membangun aplikasi Todo.

Bagaimana Anda berencana untuk menerapkan login ke aplikasi Anda berikutnya? Beri tahu kami di bagian komentar.