Author: floriansemm
Date: Tue Mar 20 18:35:53 2012
New Revision: 1303074
URL: http://svn.apache.org/viewvc?rev=1303074&view=rev
Log:
LOG4PHP-174 - Firephp appender logs to Firebug console.
Added:
logging/log4php/trunk/src/main/php/appenders/LoggerAppenderFirephp.php
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderFirephpTest.php
Modified:
logging/log4php/trunk/src/main/php/LoggerAutoloader.php
Modified: logging/log4php/trunk/src/main/php/LoggerAutoloader.php
URL:
http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/LoggerAutoloader.php?rev=1303074&r1=1303073&r2=1303074&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/LoggerAutoloader.php (original)
+++ logging/log4php/trunk/src/main/php/LoggerAutoloader.php Tue Mar 20 18:35:53
2012
@@ -63,6 +63,7 @@ class LoggerAutoloader {
'LoggerAppenderMailEvent' =>
'/appenders/LoggerAppenderMailEvent.php',
'LoggerAppenderMongoDB' =>
'/appenders/LoggerAppenderMongoDB.php',
'LoggerAppenderNull' => '/appenders/LoggerAppenderNull.php',
+ 'LoggerAppenderFirephp' =>
'/appenders/LoggerAppenderFirephp.php',
'LoggerAppenderPDO' => '/appenders/LoggerAppenderPDO.php',
'LoggerAppenderPhp' => '/appenders/LoggerAppenderPhp.php',
'LoggerAppenderRollingFile' =>
'/appenders/LoggerAppenderRollingFile.php',
Added: logging/log4php/trunk/src/main/php/appenders/LoggerAppenderFirephp.php
URL:
http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/appenders/LoggerAppenderFirephp.php?rev=1303074&view=auto
==============================================================================
--- logging/log4php/trunk/src/main/php/appenders/LoggerAppenderFirephp.php
(added)
+++ logging/log4php/trunk/src/main/php/appenders/LoggerAppenderFirephp.php Tue
Mar 20 18:35:53 2012
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * LoggerAppenderFirephp
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
contributor
+ * license agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership. The ASF licenses this
+ * file to you under the Apache License, Version 2.0 (the "License"); you may
not
+ * use this file except in compliance with the License. You may obtain a copy
of
+ * the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ * CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ *
+ * PHP version 5
+ *
+ * @category Include
+ * @package LoggerAppenderFirephp
+ * @author Bruce Ingalls <Bruce.Ingalls-at-gmail-dot-com>
+ * @copyright 2012 Apache Software Foundation
+ * @license Apache License, Version 2.0
+ * @version SVN: $Id:$
+ * @link
http://sourcemint.com/github.com/firephp/firephp/1:1.0.0b1rc6/-docs/Configuration/Constants
+ * @link
https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/FirePHPHandler.php
+ * @see LoggerAutoloader.php Update class list
+ * @since Feb 22, 2012
+ * @internal CodeSniffs as PEAR style, adapted to Apache. Phpmd clean.
+ * @example require_once 'FirePHP/Init.php'; //Must be declared before
log4php
+ * @example use Monolog/Logger; //Alternate to
firephp lib
+ * @example use Monolog/Handler/FirePHPHandler;
+ */
+
+/**
+ * Connect Apache Log4php to Insight, the next version of FirePHP
+ * Read the link at sourcemint, to <b>define</b> 4 INSIGHT_* constants in your
php
+ * config / bootstrap
+ *
+ * @category Include
+ * @package LoggerAppenderFirephp
+ * @author Bruce Ingalls <Bruce.Ingalls-at-gmail-dot-com>
+ * @copyright 2012 Apache Software Foundation
+ * @license Apache License, Version 2.0
+ * @link
http://sourcemint.com/github.com/firephp/firephp/1:1.0.0b1rc6/-docs/Configuration/Constants
+ * @example define('INSIGHT_IPS', '*'); //If using firephp lib
+ * @example define('INSIGHT_AUTHKEYS', '*'); //weak security (ok for dev
only)
+ * @example define('INSIGHT_PATHS', dirname(__FILE__));
+ * @example define('INSIGHT_SERVER_PATH', '/index.php');
+ */
+class LoggerAppenderFirephp extends LoggerAppender {
+ protected $console;
+ protected $medium;
+
+ /**
+ * Default constructor
+ *
+ * @param string $name Default ''
+ */
+ public function __construct($name = '') {
+ $this->requiresLayout = false;
+
+ parent::__construct($name);
+ }
+
+ /**
+ * Enable
+ *
+ * @return void
+ */
+ public function activateOptions() {
+ $this->closed = false;
+ }
+
+ /**
+ * Write event object to Log. Defaults to INFO level
+ *
+ * @param LoggerLoggingEvent $event Includes level & message
+ *
+ * @return void
+ */
+ public function append(LoggerLoggingEvent $event) {
+ $console = $this->getConsole();
+ if (null === $console) {
+ return; //Silently fail, if FirePHP is
unavailable
+ }
+
+ $msg = '';
+ if ($this->layout !== null) {
+ $msg = trim($this->layout->format($event));
+ } else {
+ $msg = '[' . $event->getLevel()->toString() . '] - ' .
$event->getRenderedMessage();
+ }
+
+ switch (strtolower($event->getLevel()->toString())) {
+ case 'debug':
+ $console->trace($msg); //includes backtrace
+ break;
+ case 'warn':
+ $console->debug($msg);
+ break;
+ case 'error':
+ $console->warn($msg);
+ break;
+ case 'fatal':
+ $console->error($msg);
+ break;
+ default:
+ $console->info($msg);
+ }
+ }
+
+ /**
+ * Disable
+ *
+ * @return void
+ */
+ public function close() {
+ $this->closed = true;
+ }
+
+ public function __destruct() {
+ $this->close();
+ }
+
+ /**
+ * Get firephp display object
+ *
+ * @return object null, if FirePHP is unavailable
+ */
+ private function getConsole() {
+ if (isset($this->console)) {
+ return $this->console;
+ }
+
+ if (method_exists('FirePHP', 'to')) {
+ $inspector = FirePHP::to($this->getMedium());
+
+ return $inspector->console();
+ }
+
+ return null;
+ }
+
+ /**
+ * Get medium, typically 'page'
+ *
+ * @return string
+ */
+ public function getMedium() {
+ return $this->medium;
+ }
+
+ /**
+ * Sets medium. Defaults to 'page' for firebug console
+ *
+ * @param string $medium
+ *
+ * @return void
+ */
+ public function setMedium($medium='page') {
+ $this->setString('medium', $medium);
+ }
+
+}
Added:
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderFirephpTest.php
URL:
http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/appenders/LoggerAppenderFirephpTest.php?rev=1303074&view=auto
==============================================================================
--- logging/log4php/trunk/src/test/php/appenders/LoggerAppenderFirephpTest.php
(added)
+++ logging/log4php/trunk/src/test/php/appenders/LoggerAppenderFirephpTest.php
Tue Mar 20 18:35:53 2012
@@ -0,0 +1,198 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @category tests
+ * @package log4php
+ * @subpackage appenders
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License,
Version 2.0
+ * @version SVN: $Id$
+ * @link http://logging.apache.org/log4php
+ * @internal Phpmd clean.
+ */
+
+require_once('FirePHPCore/FirePHP.class.php');
+
+/**
+ * @group firephp
+ */
+class LoggerAppenderFirephpTest extends PHPUnit_Framework_TestCase {
+
+ private $config = array(
+ 'rootLogger' => array(
+ 'appenders' => array('default'),
+ ),
+ 'appenders' => array(
+ 'default' => array(
+ 'class' => 'LoggerAppenderFirephp',
+ 'layout' => array(
+ 'class' => 'LoggerLayoutPattern',
+ ),
+ 'params' => array('medium' => 'page')
+ )
+ )
+ );
+
+ public function testRequiresLayout() {
+ $firephp = FirePHP::getInstance(true);
+
+ $appender = new LoggerAppenderFirephp();
+ self::assertFalse($appender->requiresLayout());
+ }
+
+ public function testSetMedium() {
+ $appender = new LoggerAppenderFirephp();
+ $appender->setMedium('page');
+ self::assertSame('page', $appender->getMedium());
+ }
+
+ private function createEvent($message, $level) {
+ $eventMock = $this->getMock('LoggerLoggingEvent', array(),
array(), '', false);
+ $eventMock->expects($this->any())
+ ->method('getRenderedMessage')
+ ->will($this->returnValue($message));
+
+ $levelMock = $this->getMock('LoggerLevel', array(), array(),
'', false);
+ $levelMock->expects($this->any())
+ ->method('toString')
+ ->will($this->returnValue($level));
+
+ $eventMock->expects($this->any())
+ ->method('getLevel')
+ ->will($this->returnValue($levelMock));
+
+ return $eventMock;
+ }
+
+ public function testAppend_HandleDebug() {
+ $console = new FirePHPSpy();
+
+ $appender = new TestableLoggerAppenderFirePhp();
+ $appender->setConsole($console);
+
+ $expectedMessage = 'trace message';
+ $expectedLevel = 'debug';
+
+ $appender->append($this->createEvent($expectedMessage,
$expectedLevel));
+
+ $this->assertLog($console, $expectedMessage, 'debug');
+ }
+
+ public function testAppend_HandleWarn() {
+ $console = new FirePHPSpy();
+
+ $appender = new TestableLoggerAppenderFirePhp();
+ $appender->setConsole($console);
+
+ $expectedMessage = 'debug message';
+ $expectedLevel = 'warn';
+
+ $appender->append($this->createEvent($expectedMessage,
$expectedLevel));
+
+ $this->assertLog($console, $expectedMessage, 'warn');
+ }
+
+ public function testAppend_HandleError() {
+ $console = new FirePHPSpy();
+
+ $appender = new TestableLoggerAppenderFirePhp();
+ $appender->setConsole($console);
+
+ $expectedMessage = 'error message';
+ $expectedLevel = 'error';
+
+ $appender->append($this->createEvent($expectedMessage,
$expectedLevel));
+
+ $this->assertLog($console, $expectedMessage, 'error');
+ }
+
+ public function testAppend_HandleFatal() {
+ $console = new FirePHPSpy();
+
+ $appender = new TestableLoggerAppenderFirePhp();
+ $appender->setConsole($console);
+
+ $expectedMessage = 'fatal message';
+ $expectedLevel = 'fatal';
+
+ $appender->append($this->createEvent($expectedMessage,
$expectedLevel));
+
+ $this->assertLog($console, $expectedMessage, 'fatal');
+ }
+
+ public function testAppend_HandleDefault() {
+ $console = new FirePHPSpy();
+
+ $appender = new TestableLoggerAppenderFirePhp();
+ $appender->setConsole($console);
+
+ $expectedMessage = 'info message';
+ $expectedLevel = 'info';
+
+ $appender->append($this->createEvent($expectedMessage,
$expectedLevel));
+
+ $this->assertLog($console, $expectedMessage, 'info');
+ }
+
+ public function assertLog($console, $expectedMessage, $logLevel) {
+ $this->assertEquals('['.$logLevel.'] - '.$expectedMessage,
$console->getMessage());
+ $this->assertEquals(1, $console->getCalls(), 'info wasn\'t
called once');
+ }
+}
+
+class TestableLoggerAppenderFirePhp extends LoggerAppenderFirephp {
+ public function setConsole($console) {
+ $this->console = $console;
+ }
+}
+
+class FirePHPSpy {
+ private $calls = 0;
+ private $message = '';
+
+ public function getCalls() {
+ return $this->calls;
+ }
+
+ public function getMessage() {
+ return $this->message;
+ }
+
+ public function trace($message) {
+ $this->calls++;
+ $this->message = $message;
+ }
+
+ public function debug($message) {
+ $this->calls++;
+ $this->message = $message;
+ }
+
+ public function warn($message) {
+ $this->calls++;
+ $this->message = $message;
+ }
+
+ public function error($message) {
+ $this->calls++;
+ $this->message = $message;
+ }
+
+ public function info($message) {
+ $this->calls++;
+ $this->message = $message;
+ }
+}