Logging

Yii menyediakan fitur logging yang fleksibel dan bisa ekstensibel. Logging message dapat diklasifikasikan berdasarkan level log atau kategori message. Menggunakan filter tingkat dan kategori, message yang dipilih selanjutnya bisa diarahkan ke tujuan yang berbeda, misalnya file, email, jendela browser, dll.

1. Logging Message

Message dapat dicatat dengan memanggil Yii::log atau Yii::trace. Perbedaan di antara kedua metode ini adalah bahwa Yii::trace hanya mencatat message saat aplikasi dalam mode debug.

Yii::log($message, $level, $category);
Yii::trace($message, $category);

Ketika mencatat message, kita harus menetapkan tingkat dan kategorinya. Kategori adalah string dalam bentuk xxx.yyy.zzz yang mirip dengan alias path. Contoh, jika message dicatat dalam CController, kita bisa menggunakan kategori system.web.CController. Level message harus salah satu dari nilai berikut:

  • trace: ini adalah tingkat yang dipakai oleh Yii::trace. kegunaannya untuk melacak alur eksekusi aplikasi selama pengembangan.

  • info: ini untuk pencatatan informasi umum.

  • profile: ini untuk profil performa (yang akan segera dijelaskan).

  • warning: ini untuk message peringatan.

  • error: ini untuk message kesalahan fatal.

2. Message Routing

Message yang dicatat menggunakan Yii::log or Yii::trace disimpan dalam memori. Kita biasanya harus menampilkannya dalam browser, atau menyimpannya dalam beberapa media penyimpan yang menetap seperti file, email. Ini disebut messages routing(mengirimkan pesan), misalnya mengirimkan message ke tujuan yang berbeda.

Dalam Yii, message routing diatur oleh komponen aplikasi CLogRouter. CLlogRouter mengatur satu kumpulan yang disebut log routes(rute log). Tiap log route mewakili satu tujuan log. Message yang dikirimkan bersamaan dengan log route bisa disaring berdasarkan pada tingkat dan kategorinya.

Untuk menggunakan message routing, kita harus menginstalasi dan mengaktifkan komponen aplikasi CLogRouter. Kita juga harus mengkonfigurasi properti routes dengan log route yang kita inginkan. Berikut ini ditampilkan contoh konfigurasi aplikasi yang dibutuhkan:

array(
    ......
    'preload'=>array('log'),
    'components'=>array(
        ......
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'trace, info',
                    'categories'=>'system.*',
                ),
                array(
                    'class'=>'CEmailLogRoute',
                    'levels'=>'error, warning',
                    'emails'=>'admin@example.com',
                ),
            ),
        ),
    ),
)

Dalam contoh di atas, kita memiliki dua log route. Rute pertama adalah CFileLogRoute yang menyimpan message dalam sebuah file di bawah direktori runtime aplikasi. Hanya message-message yang tingkatnya adalah trace atau info dan kategorinya dimulai dengan system. yang disimpan. Rute kedua adalah CEmailLogRoute yang mengirimkan message ke alamat email yang sudah ditetapkan. Hanya message yang tingkatannya error atau warning yang dikirimkan.

Berikut Log Route yang tersedia dalam Yii:

  • CDbLogRoute: menyimpan message dalam tabel database.
  • CEmailLogRoute: mengirimkan message ke alamat email yang ditetapkan.
  • CFileLogRoute: menyimpan message dalam sebuah file di bawah direktori runtime aplikasi.
  • CWebLogRoute: menampilkan message di akhir halaman Web saat ini.
  • CProfileLogRoute: menampilkan message profil di akhir halaman Web saat ini.

Info: Pengiriman message terjadi di akhir siklus permintaan saat ini saat event onEndRequest dimunculkan. Untuk mengakhiri pemrosesan permintaan saat ini secara eksplisit, panggil CApplication::end() alih-alih die() atau exit(), karena CApplication::end() akan memunculkan event onEndRequest dan message bisa dicatat dengan benar.

3. Penyaringan Message

Seperti yang telah dijelaskan, message dapat difilter berdasarkan tingkatan dan kategori nya sebelum lama dikirim ke log route. Hal ini dapat dicapai dengan melakukan pengaturan pada properti levels dan categories pada log route yang bersangkutan. Diharuskan memberikan titik koma jika ingin menggabungkan beberapa tingkatan dan kategori.

Karena kategori message dalam bentuk xxx.yyy.zzz, kita bisa memperlakukannya sebagai hirarki kategori. Khususnya, kita katakan xxx adalah induk dari xxx.yyy yang merupakan induk dari xxx.yyy.zzz. Selanjutnya kita bisa menggunakan xxx.* untuk mewakili kategori xxx dan semua turunan kategori.

4. Pencatatan Informasi Konteks

Kita bisa menetapkan log informasi konteks tambahan, seperti variabel pradefinisi PHP (misal $_GET, $_SERVER), session ID, nama pengguna, dll. Ini dilakukan dengan menetapkan properti CLogRoute::filter pada rute log agar sesuai dengan penyaringan log.

Framework dilengkapi dengan CLogFilter yang bisa dipakai sebagai filter log yang paling dibutuhkan dalam banyak hal. Secara standar, CLogFilter akan mencatat message dengan variabel seperti $_GET, $_SERVER yang seringkali berisi informasi konteks sistem yang berharga. CLogFilter juga dapat dikonfigurasi untuk mengawali setiap message yang dicatat dengan ID sesi, nama pengguna, dll., yang secara menyeluruh menyederhanakan pencarian global saat memeriksa berbagai message tercatat.

Konfigurasi berikut memperlihatkan bagaimana untuk mengaktifkan informasi konteks. Catatan bahwa setiap rute log dapat memiliki filter lognya sendiri. Dan distandarkan, rute log tidak memiliki filter log.

array(
    ......
    'preload'=>array('log'),
    'components'=>array(
        ......
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error',
                    'filter'=>'CLogFilter',
                ),
                ...other log routes...
            ),
        ),
    ),
)

Mulai dari versi 1.0.7, Yii mendukung pencatatan pemanggilan informasi stack dalam message yang dicatat dengan memanggil Yii::trace. Fitur ini dimatikan secara default karena memperlambat kinerja. Untuk menggunakan fitur ini, cukup definisikan konstan bernama YII_TRACE_LEVEL di awal entri skrip (sebelum menyertakan yii.php) ke integer lebih besar daripada 0. Kemudian Yii akan menambahkan setiap pelacakan message dengan nama file dan nomor baris pada stack panggilan yang dimiliki kode aplikasi. Jumlah YII_TRACE_LEVEL menentukan berapa banyak lapisan dari setiap stack panggilan harus disimpan. Informasi ini adakalanya berguna selama tahap pengembangan karena dapat membantu kita mengidentifikasi tempat yang memicu pelacakan message.

5. Pengukuran Performa

Pengukuran performa adalah jenis pencatatan message khusus. Pengukuran performa bisa dipakai untuk mengukur waktu yang dibutuhkan untuk blok kode yang ditetapkan dan mencari tahu hambatan(bottleneck) apa pada performa.

Untuk menggunakan pengukuran performa, kita harus mengidentifikasi blok kode yang akan diukur. Kita tandai setiap awal dan akhir blok kode dengan menyisipkan metode berikut:

Yii::beginProfile('blockID');
...blok kode sedang diukur...
Yii::endProfile('blockID');

dengan blockID adalah ID yang secara unik mengidentifikasi blok kode.

Harap diketahui, blok kode harus di-nested dengan benar. Yakni, blok kode tidak bisa bersinggungan(intersect) dengan yang lain. Blok kode harus antara dalam tingkat paralel atau dikurung seluruhnya oleh blok kode lain.

Untuk memperlihatkan hasil pengukuran, kita harus menginstalasi komponen aplikasi CLogRouter dengan rute log CProfileLogRoute. Hal ini sama seperti yang kita lakukan dengan message routing biasa. Rute CProfileLogRoute akan menampilkan hasil pengukuran di akhir halaman tersebut.

6. Mengukur Eksekusi SQL

Pengukuran sangat berguna terutama saat bekerja dengan database karena eksekusi SQL sering menjadi sumber bottleneck kinerja yang utama pada aplikasi. Sementara kita dapat menyisipkan pernyataan beginProfile dan endProfile secara manual di tempat yang sesuai guna mengukur waktu yang diperlukan dalam setiap eksekusi SQL, Yii menyediakan pendekatan yang lebih sistematis untuk memecahkan masalah ini.

Dengan menyetel CDbConnection::enableProfiling menjadi true dalam konfigurasi aplikasi, setiap pernyataan SQL yang sedang dijalankan akan diukur. Hasilnya bisa ditampilkan menggunakan CProfileLogRoute yang sudah disebutkan sebelumnya, yang dapat memperlihatkan berapa lama waktu yang dibutuhkan dalam menjalankan pernyataan SQL. Kita juga dapat memanggil CDbConnection::getStats() untuk mengambil jumlah pernyataan SQL dan total waktu eksekusi.

$Id: topics.logging.txt 2890 2011-01-18 15:58:34Z qiang.xue $

Be the first person to leave a comment

Please to leave your comment.