Log4php -  implementing PSR3

Dengan berlalunya PSR-3 baru-baru ini, sebuah standar antarmuka umum untuk perpustakaan logging, tampaknya tepat untuk membahas implementasinya dengan library favorit saya. log4php adalah sebuah proyek open source Apache yang merupakan framework logging yang sangat serbaguna.

Melalui file konfigurasi log4php itu, logging memiliki berbagai lokasi output, sehingga mungkin untuk mengirim tingkat log khusus menuju lokasi output yang berbeda. Sebagai contoh: debug, info, dan pemberitahuan digunakan secara umum untuk logging dan debugging, sehingga masuk akal untuk mengarahkan hal ini ke file log standar, sedangkan critical dan tingkat diatasnya biasanya berarti ada sesuatu yang tidak beres dengan aplikasi kita dan itu membuat lebih masuk akal untuk mengirim log ini ke diri kita sendiri melalui email untuk diagnosis segera.

Mendapatkan Dependensi

Sebelum kita dapat mulai menulis kode, kita memerlukan dependensinya. Interface Class PSR-3 diperlukan, saat ini dapat ditemukan di GitHub dan dapat diinstal melalui  composer dari Packagist. Juga, framwork log4php diperlukan, yang dapat didownload dari Apache, dengan PEAR, atau composer.

Disini adalah contoh file composer.json untuk melakukan semua itu:

{
    "require": {
        "psr/log": "dev-master",
        "apache/log4php": "2.3.0"
    }
}

Wrapping log4php

Dengan library pihak ketiga yang diperlukan telah terinstal, kita dapat membuat kelas logging generik yang mengimplementasikan interface PSR-3  dan menggunakan log4php.

Delapan tingkat log yang berbeda terpapar oleh interface PSR-3 : debug, info, pemberitahuan, peringatan, kesalahan, kritis, waspada, dan darurat. log4php berisi enam tingkat logging: trace, debug, info, warn, error, dan fatal. Kita harus memetakan tingkat PSR-3  ke tingkat log4php yang tepat. Class dibawah ini mengimplementasikan interface dan mengelola instance log4php logger untuk memetakan levelnya.

<?php
require_once 'vendor/autoload.php';
 
class MyLogger implements PsrLogLoggerInterface
{
    private $logger;
 
    public function __construct($logger = 'main', $config = null) {
        Logger::configure($config);
        $this->logger = Logger::getLogger($logger);
    }
 
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function emergency($message, array $context = array()) {
        $this->logger->fatal($this->interpolate($message, $context));
    }
 
    /**
     * Action must be taken immediately.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function alert($message, array $context = array()) {
       $this->logger->fatal($this->interpolate($message, $context));
    }
 
    /**
     * Critical conditions.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function critical($message, array $context = array()) {
        $this->logger->fatal($this->interpolate($message, $context));
    }
 
    /**
     * Runtime errors that do not require immediate action but should
     * be logged and monitored.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function error($message, array $context = array()) {
        $this->logger->error($this->interpolate($message, $context));
    }
 
    /**
     * Exceptional occurrences that are not errors.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function warning($message, array $context = array()) {
        $this->logger->warn($this->interpolate($message, $context));
    }
    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function notice($message, array $context = array()) {
        $this->logger->info($this->interpolate($message, $context));
    }
 
    /**
     * Interesting events.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function info($message, array $context = array()) {
        $this->logger->info($this->interpolate($message, $context));
    }
 
    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function debug($message, array $context = array()) {
        $this->logger->debug($this->interpolate($message, $context));
    }
 
    /**
     * Logs with an arbitrary level.
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return null
     */
    public function log($level, $message, array $context = array()) {
        throw new Exception('Please call specific logging message');
    }
 
    /**
     * Interpolates context values into the message placeholders.
     * Taken from PSR-3's example implementation.
     */
    protected function interpolate($message, array $context = array()) {
        // build a replacement array with braces around the context
        // keys
        $replace = array();
        foreach ($context as $key => $val) {
            $replace['{' . $key . '}'] = $val;
        }
 
        // interpolate replacement values into the message and return
        return strtr($message, $replace);
    }
}

Selain mengimplementasikan interface PSR-3 , class ini berisi konstruktor yang menerima 2 parameter opsional bernama $logger dan $config. Parameter pertama memungkinkan Anda untuk menentukan nama untuk logger dan log4php akan mempertahankan referensi itu untuk  memungkinkan Anda mempertahankan beberapa contoh logger pada saat yang sama dengan nama yang berbeda. Parameter kedua memungkinkan Anda untuk menentukan file konfigurasi. Jika tidak di tentukan, log4php akan menggunakan konfigurasi default.

The newly created MyLogger class can now be tested with the following example:

Class MyLogger yang baru dibuat sekarang dapat diuji dengan contoh berikut:

<?php
$logger = new MyLogger();
$logger->debug('My debug test');

Pengaturan log4php default untuk debug akan menampilkan pesan ke standar output, sehingga hasil contoh ini akan dikirim ke web browser.

Konfigurasi log4php

log4php terisi dengan konfigurasi default sehingga kita bisa langsung mulai menggunakannya, tetapi juga menyediakan kemampuan untuk menimpa konfigurasinya menggunakan XML atau kode PHP. Konfigurasi paling populer yang didukung adalah XML.

Mari kita membuat file config.xml dengan appender baru yang akan memberitahu log4php untuk me-log semua pesan dengan tingkat warn hingga tingkat diatasnya ke file:

<configuration xmlns="http://logging.apache.org/log4php/">
 <appender name="myAppender" class="LoggerAppenderFile">
  <param name="file" value="myLog.log"/>
 </appender>
 <root>
  <level value="WARN"/>
   <appender_ref ref="myAppender"/>
  </root>
</configuration>

Kita sekarang harus melewatkan nama file konfigurasi baru untuk MyLogger ketika kita memanggil konstruktornya.

<?php
$logger = new MyLogger('main', 'config.xml');
$logger->debug('My debug test');

Jika Anda menjalankan kembali  contoh diatas, ketika pesan debug disebut, log4php akan mengabaikannya karena debug berada di bawah level warn dan konfigurasi kita hanya me-log warn dan level diatasnya.

Kesimpulan

By leveraging the PSR-3 logging interface and log4php, standards-compliant logging is now extremely simple to add to any of our projects. To learn more about log4php, visit the Quick Start guide. For more about PSR-3, read the standard on GitHub.

Dengan memanfaatkan interface logging PSR-3 dan log4php, Menangani log sesuai standar sekarang sangat sederhana untuk ditambahkan ke salah satu proyek kita. Untuk mempelajari lebih lanjut tentang log4php, kunjungi panduan Quick Start. Untuk mengetahui lebih lanjut tentang PSR-3, baca standarnya di GitHub.

Diterjemahkan bebas dari http://phpmaster.com/implementing-psr-3-with-log4php/

Advertisements

About phpgeek programmer

pemimpi yang berharap menjadi the best programmer di zamannya

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s