You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4php-dev@logging.apache.org by Gayaz Yusipov <gz...@vingrad.ru> on 2010/07/19 14:55:30 UTC

log4php LoggerAppenderFirePHP patch

Hello!

Here is a patch that appends log events to the FirePHP Firefox Extension:


*== Step 1 ==*

"Logger.php" file:

after line
(75) 'LoggerAppenderFile' => '/appenders/
LoggerAppenderFile.php',
add new line:
(76) 'LoggerAppenderFirePHP' => '/appenders/LoggerAppenderFirePHP.php',

*== Step 2 ==*

Create "/appenders/LoggerAppenderFirePHP.php" file with code:


<?php
>
> /**
>  * FirePHP LoggerAppender for log4php.
>  *
>  * <p>Appends log events to the FirePHP Firefox Extension.</p>
>  * <p>The data can be displayed in the Firebug Console or in the
>  * "Server" request tab.</p>
>  *
>  * <p>For more information see: http://www.firephp.org/</p>
>  *
>  * <p>Attention: PHP 5 >= 5.2.0 version required.</p>
>  *
>  * @author Gayaz Yusipov <gzep at vingrad dot ru>
>  * @package log4php
>  * @subpackage appenders
>  */
>
> class LoggerAppenderFirePHP extends LoggerAppender {
>
>     private
>         /**
>          * Wildfire protocol message index.
>          *
>          * @var integer
>          * @access private
>          */
>         $index = 1,
>
>         /**
>          * Comparison of event types.
>          * <p>Keys are {@link LoggerLevel}, values are FirePHP levels.</p>
>          *
>          * @var array
>          * @access private
>          */
>         $types = array(
>             'TRACE' => 'LOG',
>             'DEBUG' => 'LOG',
>             'INFO' => 'INFO',
>             'WARN' => 'WARN',
>             'ERROR' => 'ERROR',
>             'FATAL' => 'ERROR'
>         );
>
>     public function __construct($name = "") {
>
>         /**
>          * PHP 5 >= 5.2.0 version required.
>          */
>         if (!function_exists("json_encode")) {
>
>             return $this->close();
>
>         }
>
>         parent::__construct($name);
>         $this->requiresLayout = true;
>         $this->sendHeader("X-Wf-Protocol-1", "
> http://meta.wildfirehq.org/Protocol/JsonStream/0.2");
>         $this->sendHeader("X-Wf-1-Plugin-1", "
> http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3");
>         $this->sendHeader("X-Wf-1-Structure-1", "
> http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1");
>
>     }
>
>     public function __destruct() {
>
>         $this->close();
>
>     }
>
>     public function activateOptions() {
>
>         $this->closed = false;
>
>     }
>
>     public function close() {
>
>         $this->closed = true;
>
>     }
>
>     public function append(LoggerLoggingEvent $event) {
>
>         $this->sendHeader("X-Wf-1-1-1-" . $this->index,
> $this->encodeEvent($event));
>         $this->index++;
>
>     }
>
>     /**
>      * Send a raw HTTP header.
>      *
>      * @param string $name The header name string.
>      * @param string $value The value name string.
>      * @return void
>      */
>     private function sendHeader($name, $value) {
>
>         /**
>          * If headers already sent
>          */
>         if (headers_sent($file, $line)) {
>
>             return $this->close();
>
>         }
>
>         return header($name . ": " . $value);
>
>     }
>
>     /**
>      * Encode LOG4PHP event to FirePHP header data.
>      *
>      * @param LoggerLoggingEvent $event
>      * @return string $data
>      */
>     private function encodeEvent(LoggerLoggingEvent $event) {
>
>         $buf = "[";
>         $locInfo = $event->getLocationInformation();
>
>         /**
>          * Put the JSON object containing information about the log message
>          */
>         $buf .= json_encode(
>             array(
>                 'Class' => $locInfo->getClassName(),
>                 'Type' => $this->types[$event->getLevel()->toString()],
>                 'Function' => $locInfo->getMethodName(),
>                 'File' => $locInfo->getFileName(),
>                 'Line' => $locInfo->getLineNumber()
>             )
>         );
>
>         /**
>          * Put the actual log message in JSON format
>          */
>         if($this->layout === null) {
>             $msg = $event->getRenderedMessage();
>         } else {
>             $msg = $this->layout->format($event);
>         }
>         $buf .= "," . json_encode($msg) . "]";
>
>         /**
>          * strlen($buf) returns the number of bytes between the two |
>          */
>         return strlen($buf) . "|" . $buf . "|";
>
>     }
>
> }
>
> ?>
>

*== Step 3 ==*

Usage:

"log4php.cfg.php" file example


>     return array(
>
>         'threshold' => 'ALL',
>
>         'rootLogger' => array(
>
>             'level' => 'ALL',
>             'appenders' => array('default')
>
>         ),
>
>         'appenders' => array(
>
>             'default' => array(
>
>                 'class' => 'LoggerAppenderFirePHP',
>
>                 'layout' => array(
>
>                     'class' => 'LoggerLayoutPattern',
>                     'conversionPattern' => '%d{Y-m-d H:i:s} %p %m in %F at
> %L'
>
>                 )
>
>             )
>
>         )
>
>     )


Test it!

$config = require("log4php.cfg.php");
> require(LOG4PHP_DIR . "Logger.php");
> Logger::configure($config, "LoggerConfiguratorPhp");
> $logger = Logger::getRootLogger();
>
> $logger->trace("TRACE");//(Generate FirePHP LOG level)
> $logger->debug("DEBUG");//(Generate FirePHP LOG level)
> $logger->info("INFO");//(Generate FirePHP INFO level)
> $logger->warn("WARN");//(Generate FirePHP WARN level)
> $logger->error("ERROR");//(Generate FirePHP ERROR level)
> $logger->fatal("FATAL");//(Generate FirePHP ERROR level)
>

Best regards, Gayaz Yusipov