Belajar Yii - Logging, Debugging & Profiling
Series/Belajar Yii/Episode 13
Episode 13 of 27

Belajar Yii - Logging, Debugging & Profiling

Membekali aplikasi dengan observabilitas: menulis log dengan kategori yang tepat lewat Yii::info, error, warning, dan trace; mengirim log ke target file, database, atau email; membedah request dengan Yii Debug Toolbar; serta profiling dengan beginProfile dan endProfile untuk menemukan bottleneck performa.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Aplikasi yang sudah berjalan bukan berarti masalahnya selesai — masalah justru muncul saat production: halaman lambat, error sporadis, data tidak konsisten. Dan tanpa observabilitas, kalian menebak-nebak di dalam kegelapan. Logging, debugging, dan profiling adalah lampu yang menerangi kegelapan itu.

Yii menyediakan ketiganya sebagai bagian inti framework: logger terpusat dengan target fleksibel, Debug Toolbar yang membedah setiap request, dan profiler untuk mengukur waktu eksekusi per bagian kode. Di episode ini kita mengaktifkan semuanya dan mempraktikkannya pada aplikasi nyata.

Logging: Menulis Log dengan Kategori

Semua log Yii mengalir lewat Yii::log dengan empat level:

Empat level log
use Yii;
 
Yii::trace('Mulai memproses order #123', 'app\order');
Yii::info('Order #123 disimpan', 'app\order');
Yii::warning('Disk usage di atas 80%', 'app\system');
Yii::error('Gagal menghubungi API pembayaran', 'app\payment');

Perhatikan kategori (argumen kedua). Ini bukan formalitas: kategori adalah cara memfilter log — di target, di Debug Toolbar, dan saat kalian menelusuri jejak satu alur bisnis. Konvensi yang lazim: gunakan __METHOD__ atau nama class sebagai kategori agar setiap log bisa dilacak ke sumbernya.

Log dengan kategori dari nama method
public function actionPay(int $orderId): string
{
    Yii::info("Mulai pembayaran order $orderId", __METHOD__);
    // ... logika pembayaran ...
    Yii::info("Pembayaran order $orderId selesai", __METHOD__);
}

Log Target

Logger menampung pesan di memori; log target yang menulisnya ke tujuan akhir. Konfigurasi di config/web.php:

config/web.php - log targets
'components' => [
    'log' => [
        'traceLevel' => 3,
        'targets' => [
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['error', 'warning'],
                'logFile' => '@runtime/logs/app.log',
            ],
            [
                'class' => 'yii\log\FileTarget',
                'categories' => ['app\payment'],
                'logFile' => '@runtime/logs/payment.log',
            ],
            [
                'class' => 'yii\log\DbTarget',
                'levels' => ['error'],
                'logTable' => '{{%log}}',
            ],
            [
                'class' => 'yii\log\EmailTarget',
                'levels' => ['error'],
                'message' => [
                    'from' => ['monitoring@example.com'],
                    'to' => ['admin@example.com'],
                    'subject' => 'Error aplikasi Yii',
                ],
            ],
        ],
    ],
],
TargetGunakan Untuk
FileTargetLog standar, pisahkan per kategori di file berbeda
DbTargetLog yang ingin dicari/difilter lewat SQL
EmailTargetPeringatan kritis yang harus langsung diketahui admin
SyslogTargetIntegrasi dengan syslog server
TelegramTarget / customNotifikasi ke chat ops (via ekstensi)

traceLevel => 3 membuat setiap log menyertakan 3 level stack trace — informasi krusial saat menelusuri error. Untuk database target, buat tabel log-nya:

Buat tabel log untuk DbTarget
php yii migrate/up --migrationPath=@yii/log/migrations

Tip

Level trace biasanya tidak ditulis ke file production karena terlalu banyak. Pola yang umum: di production simpan error + warning ke file dan error ke email; aktifkan info/trace hanya di development. Atur lewat levels per target — Yii memberi kontrol penuh tanpa mengubah kode.

Yii Debug Toolbar

Debug Toolbar adalah panoptikon request: ia menampilkan semua yang terjadi dalam satu request — query SQL, durasi, log, variabel, dan banyak lagi. Pasang sebagai module dev:

Install debug toolbar
composer require yiisoft/yii2-debug --dev
config/web.php - module debug
'modules' => [
    'debug' => [
        'class' => 'yii\debug\Module',
        'allowedIPs' => ['127.0.0.1', '::1'],
    ],
],

Toolbar muncul sebagai bar di sudut halaman. Klik untuk membuka Debug Panel dengan informasi per request:

  • Request: method, URL, status, waktu eksekusi total.
  • Database: setiap query SQL beserta durasi dan jumlah baris — di sinilah query N+1 atau query lambat terlihat nyata.
  • Log: seluruh log request berdasarkan level dan kategori.
  • Assets / View / Config: bagaimana halaman dirakit.
  • Timeline: peta visual bagian mana yang memakan waktu.

Ini mengubah debugging dari print_r dan trial-error menjadi pemeriksaan sistematis — setiap request punya "black box recorder" sendiri.

Profiling: Mengukur Bagian Kode

Saat Toolbar menunjukkan halaman lambat, langkah berikutnya: menemukan bagian mana yang lambat. Profiling menjawabnya dengan mengukur waktu eksekusi potongan kode:

Profiling manual
use Yii;
 
Yii::beginProfile('build_dashboard');
 
$stats = Order::find()
    ->select(['status', 'COUNT(*) AS total'])
    ->groupBy('status')
    ->asArray()
    ->all();
 
Yii::endProfile('build_dashboard');

Pasangan beginProfile/endProfile mengukur durasi blok di antara keduanya. Hasilnya muncul di Toolbar (panel Timeline), sehingga kalian bisa membandingkan durasi tiap blok dan menemukan yang dominan.

Profiling Query Otomatis

Query database sudah otomatis di-profil oleh Yii. Di panel Database, perhatikan kolom durasi:

Mengidentifikasi query lambat di log
'components' => [
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=blog',
        'enableQueryLog' => true,  // catat semua query
    ],
],

Di production, jangan biarkan enableQueryLog selalu nyala (boros memori) — nyalakan hanya saat investigasi, atau log query di atas ambang durasi tertentu lewat profiling database bawaan.

Praktik: Instrumentasi Alur Bisnis

Praktik terbaik: beri setiap alur bisnis penting jejak log yang konsisten. Contoh alur pembayaran:

Instrumentasi alur pembayaran
public function actionPay(int $orderId): string
{
    Yii::info("Mulai pembayaran order $orderId", 'app\payment');
    Yii::beginProfile('payment_' . $orderId);
 
    $order = Order::findOne($orderId);
    if ($order === null) {
        Yii::warning("Order $orderId tidak ditemukan", 'app\payment');
        throw new NotFoundHttpException();
    }
 
    try {
        $this->charge($order);
        Yii::info("Order $orderId berhasil dibayar", 'app\payment');
    } catch (\Throwable $e) {
        Yii::error("Order $orderId gagal: {$e->getMessage()}", 'app\payment');
        throw $e;
    }
 
    Yii::endProfile('payment_' . $orderId);
    return $this->render('success', ['order' => $order]);
}

Dengan pola ini, setiap masalah pembayaran bisa ditelusuri: kategori app\payment memfilter semua pesan, profil mengukur durasi, dan level error/warning memicu notifikasi.

Penutup

Inti yang harus dibawa pulang:

  • Log dengan kategori yang jelas (__METHOD__ atau nama alur) — kunci untuk menelusuri masalah.
  • Arahkan log ke target yang tepat: file, database, email, syslog.
  • Debug Toolbar membedah setiap request: query, durasi, log, timeline.
  • beginProfile/endProfile mengukur waktu blok kode untuk menemukan bottleneck.
  • traceLevel => 3 melampirkan stack trace ke setiap log.

Di episode 14 selanjutnya, kita membongkar mekanisme internal yang sudah dipakai sejak episode 2: events, behaviors & extensions — mendefinisikan event dan handler, mengaitkan behavior ke komponen, lalu mempublikasikan extension Yii sendiri sebagai package Composer yang bisa dipakai lintas project. Sampai jumpa di episode 14!

Belajar Yii - Logging, Debugging & Profiling | Belajar Yii