Logging Dengan MonoLog Di PHP dan Laravel


Salah satu library yang hampir selalu dipakai dalam setiap proyek Java adalah log4j. Library ini dipakai untuk mencatat pesan ke sebuah file atau output lainnya. Setiap pesan dalam memiliki level seperti fatal, error, warn, info, debug atau trace. Pembuat aplikasi dapat menentukan level yang akan ditampilkan dalam hasi log. Sebagai contoh, pada saat pengembangan aplikasi, saya sering mengatur level logging hingga ke debug sehingga supaya lebih mudah menemukan sumber kesalahan. Pada saat produksi, saya hanya memakai level error supaya aplikasi tidak terlalu sibuk mencatat log dan ukuran file log tidak terlalu besar.

Sebuah alternatif sejenis log4j untuk PHP adalah Monolog. Library ini tampaknya cukup terkenal karena framework populer di PHP seperti Symfony 2 dan Laravel 4 sudah dilengkapi dengan Monolog. Berdasarkan informasi yang ada di repository-nya, Monolog mendukung level berupa debug, info, notice, warning, error, critical, alert dan emergency. Sama seperti pada log4j, Mono juga terdiri atas beberapa class ringan seperti Logger untuk menulis log (dipanggil oleh aplikasi), beberapa implementasi handler seperti StreamHandler atau FirePHPHandler() untuk menentukan tujuan log, dan formatter seperti LineFormatter untuk menentukan format log yang dihasilkan.

Framework Laravel 4 melakukan enkapsulasi class Logger milik Monolog ke dalam class \Illuminate\Log\Writer sehingga penggunanya tidak memanggil Logger secara langsung. Class Writer tersebut menyediakan method seperti useFiles() dan useDailyFiles() yang pada dasarnya adalah shorcut (cara singkat) dari memanggil Logger->pushHandler() milik Monolog dan menyertakan StreamHandler (untuk useFiles()) atau RotatingFileHandler (untuk useDailyFiles()).

Untuk mengakses Logger milik Monolog secara langsung dari \Illuminate\Log\Writer, saya dapat memakai kode program seperti:

$monolog = Log::getMonolog();
print $monolog->isHandling($monolog::DEBUG); 

Untuk menghasilkan log di aplikasi, saya dapat langsung memanggil \Illuminate\Log\Writer melalui fascade Log, seperti pada contoh berikut ini (di app\routes.php):

Route::get('/latihan', function()
{
    Log::debug('IP ' . Request::getClientIP() . ' membuka /latihan!');
    return 'Selamat datang!';
});

akan menghasilkan baris log seperti berikut ini:

[2014-05-01 10:30:13] production.DEBUG: IP 127.0.0.1 membuka /latihan! [] []

Secara default, saya dapat menemukan hasil log di folder app/storage/logs dalam bentuk sebuah file bernama laravel.log. Lokasi ini dapat diganti dengan mengubah isi file app/start/global.php pada baris berikut ini:

/*
|--------------------------------------------------------------------------
| Application Error Logger
|--------------------------------------------------------------------------
|
| Here we will configure the error logger setup for the application which
| is built on top of the wonderful Monolog library. By default we will
| build a basic log file setup which creates a single file for logs.
|
*/

Log::useFiles(storage_path().'/logs/laravel.log')

Bagaimana bila saya ingin memiliki format yang berbeda di hasil log? Karena useFiles() tidak menyediakan pilihan tersebut, maka saya dapat mengakses Monolog secara langsung, seperti yang terlihat pada contoh kode program berikut ini:

Log::useFiles(storage_path().'/logs/laravel.log');
$handler = Log::getMonolog()->popHandler();
$formatBaru = new MonologFormatterLineFormatter(
    "%datetime% [%level_name%] %message%n",
    "d-m-Y H:i:s"
);
$handler->setFormatter($formatBaru);
Log::getMonolog()->pushHandler($handler);

Kode program di atas akan menghasilkan log seperti:

01-05-2014 10:44:25 [DEBUG] IP 127.0.0.1 membuka URL /latihan!

Atau, bila saya ingin menghasilkan log dalam output berupa HTML, saya bisa mengubah kode program di atas menjadi berikut ini:

Log::useFiles(storage_path().'/logs/laravel.log');
$handler = Log::getMonolog()->popHandler();
$formatBaru = new MonologFormatterHTMLFormatter("d-m-Y H:i:s");
$handler->setFormatter($formatBaru);
Log::getMonolog()->pushHandler($handler)

Kode program di atas akan menghasilkan log seperti:

<h1 style="background: #cccccc;color: #ffffff;padding: 5px;">DEBUG</h1><table cellspacing="1" width="100%"><tr style="padding: 4px;spacing: 0;text-align: left;">
<th style="background: #cccccc" width="100px">Message:</th>
<td style="padding: 4px;spacing: 0;text-align: left;background: #eeeeee"><pre>IP 127.0.0.1 membuka URL /latihan!</pre></td>
</tr><tr style="padding: 4px;spacing: 0;text-align: left;">
<th style="background: #cccccc" width="100px">Time:</th>
<td style="padding: 4px;spacing: 0;text-align: left;background: #eeeeee"><pre>2014-05-01T10:45:57.733039+0000</pre></td>
</tr><tr style="padding: 4px;spacing: 0;text-align: left;">
<th style="background: #cccccc" width="100px">Channel:</th>
<td style="padding: 4px;spacing: 0;text-align: left;background: #eeeeee"><pre>production</pre></td>
</tr></table>

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: