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 gr...@apache.org on 2010/04/23 07:20:19 UTC

svn commit: r937159 - in /logging/log4php/trunk: ./ src/changes/ src/main/php/ src/main/php/renderers/ src/test/php/ src/test/php/renderers/

Author: grobmeier
Date: Fri Apr 23 05:20:19 2010
New Revision: 937159

URL: http://svn.apache.org/viewvc?rev=937159&view=rev
Log:
LOG4PHP-109 contributed from Vladimir Gorej. Patch enables throwable information associated with logging event.

Added:
    logging/log4php/trunk/src/main/php/LoggerThrowableInformation.php
    logging/log4php/trunk/src/main/php/renderers/LoggerRendererException.php
    logging/log4php/trunk/src/test/php/LoggerThrowableInformationTest.php
    logging/log4php/trunk/src/test/php/renderers/LoggerRendererExceptionTest.php
Modified:
    logging/log4php/trunk/pom.xml
    logging/log4php/trunk/src/changes/changes.xml
    logging/log4php/trunk/src/main/php/Logger.php
    logging/log4php/trunk/src/main/php/LoggerLoggingEvent.php
    logging/log4php/trunk/src/test/php/LoggerLoggingEventTest.php

Modified: logging/log4php/trunk/pom.xml
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/pom.xml?rev=937159&r1=937158&r2=937159&view=diff
==============================================================================
--- logging/log4php/trunk/pom.xml (original)
+++ logging/log4php/trunk/pom.xml Fri Apr 23 05:20:19 2010
@@ -88,9 +88,11 @@
       <email>chammers at apache.org</email>
     </developer>
   </developers>
-
   <contributors>
-  <contributor>
+  	<contributor>
+      <name>Vladimir Gorej</name>
+    </contributor>
+    <contributor>
       <name>Ivan Habunek</name>
     </contributor>
     <contributor>

Modified: logging/log4php/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/changes/changes.xml?rev=937159&r1=937158&r2=937159&view=diff
==============================================================================
--- logging/log4php/trunk/src/changes/changes.xml (original)
+++ logging/log4php/trunk/src/changes/changes.xml Fri Apr 23 05:20:19 2010
@@ -24,6 +24,7 @@
   </properties>
   <body>
   	<release version="2.1" description="Stabilizing">
+  		<action type="update" issue="LOG4PHP-109" by="Vladimir Gorej">patch for Throwable information associated with logging event</action>
   		<action type="update" issue="LOG4PHP-111" by="Ivan Habunek">Documentation: Problem using a custom ConversionPattern</action>
   		<action type="update" issue="LOG4PHP-108" by="Florian Platzer, Christian Grobmeier">Add HTML line break to LoggerAppenderEcho output</action>
   		<action type="update" by="Ivan Habunek">Included new LoggerLayoutPattern tests</action>

Modified: logging/log4php/trunk/src/main/php/Logger.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/Logger.php?rev=937159&r1=937158&r2=937159&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/Logger.php (original)
+++ logging/log4php/trunk/src/main/php/Logger.php Fri Apr 23 05:20:19 2010
@@ -108,7 +108,9 @@ class Logger {
 		'LoggerRendererDefault' => '/renderers/LoggerRendererDefault.php',
 		'LoggerRendererObject' => '/renderers/LoggerRendererObject.php',
 		'LoggerRendererMap' => '/renderers/LoggerRendererMap.php',
+		'LoggerRendererException' => '/renderers/LoggerRendererException.php',
 		'LoggerLocationInfo' => '/LoggerLocationInfo.php',
+		'LoggerThrowableInformation' => '/LoggerThrowableInformation.php',
 		'LoggerLoggingEvent' => '/LoggerLoggingEvent.php',
 		'LoggerFilter' => '/LoggerFilter.php',
 		'LoggerFilterDenyAll' => '/filters/LoggerFilterDenyAll.php',
@@ -280,7 +282,12 @@ class Logger {
 	 * @see LoggerLoggingEvent			
 	 */
 	public function forcedLog($fqcn, $caller, $level, $message) {
-		$this->callAppenders(new LoggerLoggingEvent($fqcn, $this, $level, $message));
+		$throwable = null;
+		if ($caller !== null && $caller instanceof Exception) {
+			$throwable = $caller;							 
+		}
+		
+		$this->callAppenders(new LoggerLoggingEvent($fqcn, $this, $level, $message, null, $throwable));
 	} 
 	
 	

Modified: logging/log4php/trunk/src/main/php/LoggerLoggingEvent.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/LoggerLoggingEvent.php?rev=937159&r1=937158&r2=937159&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/LoggerLoggingEvent.php (original)
+++ logging/log4php/trunk/src/main/php/LoggerLoggingEvent.php Fri Apr 23 05:20:19 2010
@@ -109,6 +109,11 @@ class LoggerLoggingEvent {
 	* @var LoggerLocationInfo Location information for the caller. 
 	*/
 	private $locationInfo = null;
+                   
+    /**
+    * @var LoggerThrowableInformation log4php internal representation of throwable
+    */
+	private $throwableInfo = null;
 	
 	/**
 	* Instantiate a LoggingEvent from the supplied parameters.
@@ -121,8 +126,9 @@ class LoggerLoggingEvent {
 	* @param LoggerLevel $priority The level of this event.
 	* @param mixed $message The message of this event.
 	* @param integer $timeStamp the timestamp of this logging event.
+    * @param Exception $throwable The throwable associated with logging event
 	*/
-	public function __construct($fqcn, $logger, $priority, $message, $timeStamp = null) {
+	public function __construct($fqcn, $logger, $priority, $message, $timeStamp = null, $throwable = null) {
 		$this->fqcn = $fqcn;
 		if($logger instanceof Logger) {
 			$this->logger = $logger;
@@ -142,6 +148,10 @@ class LoggerLoggingEvent {
 				$this->timeStamp = floatval(time());
 			}
 		}
+		
+		if ($throwable !== null && $throwable instanceof Exception) {
+			$this->throwableInfo = new LoggerThrowableInformation($throwable);
+		}
 	}
 
 	/**
@@ -331,10 +341,10 @@ class LoggerLoggingEvent {
 	}
 
 	/**
-	 * @return mixed null
+	 * @return mixed LoggerThrowableInformation
 	 */
 	public function getThrowableInformation() {
-		return null;
+		return $this->throwableInfo;
 	}
 	
 	/**

Added: logging/log4php/trunk/src/main/php/LoggerThrowableInformation.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/LoggerThrowableInformation.php?rev=937159&view=auto
==============================================================================
--- logging/log4php/trunk/src/main/php/LoggerThrowableInformation.php (added)
+++ logging/log4php/trunk/src/main/php/LoggerThrowableInformation.php Fri Apr 23 05:20:19 2010
@@ -0,0 +1,74 @@
+<?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.
+ *
+ * @package log4php
+ */
+
+/**
+ * The internal representation of throwables.
+ *
+ * @package log4php
+ * @since 2.1
+ */
+class LoggerThrowableInformation {
+	
+	/** @var Exception Throwable to log */
+	private $throwable;
+	
+	/** @var array Array of throwable messages */
+	private $throwableArray;
+	
+	/** @var Logger reference */
+	private $logger;
+	
+	/**
+	 * Create a new instance
+	 * 
+	 * @param $throwable - a throwable either as array or as a exception
+	 */
+	public function __construct($throwable)  {
+		if(is_array($throwable)) {
+		    $this->throwableArray = $throwable;
+		} else if($throwable instanceof Exception) {
+		    $this->throwable = $throwable;
+		} else {
+		    throw new InvalidArgumentException();
+		}
+	}
+	
+	/**
+	 * @desc Returns string representation of throwable
+	 * 
+	 * @return array 
+	 */
+	public function getStringRepresentation() {
+		if (!is_array($this->throwableArray) && $this->throwable !== null) {
+			$this->throwableArray = array();
+			$ex	= $this->throwable;
+			$this->throwableArray[] = $ex->getMessage();
+			while (method_exists($ex, 'getPrevious')) {
+				$ex	= $ex->getPrevious();
+				if ($ex !== null && $ex instanceof Exception) {
+					$this->throwableArray[] = $ex->getMessage();
+				}
+			}
+		}
+		
+		return $this->throwableArray;
+	}
+}
+?>
\ No newline at end of file

Added: logging/log4php/trunk/src/main/php/renderers/LoggerRendererException.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/renderers/LoggerRendererException.php?rev=937159&view=auto
==============================================================================
--- logging/log4php/trunk/src/main/php/renderers/LoggerRendererException.php (added)
+++ logging/log4php/trunk/src/main/php/renderers/LoggerRendererException.php Fri Apr 23 05:20:19 2010
@@ -0,0 +1,46 @@
+<?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.
+ *
+ * @package log4php
+ */
+
+/**
+ * Exception renderer
+ *
+ * @package log4php
+ * @subpackage renderers
+ * @since 2.1
+ */
+class LoggerRendererException implements LoggerRendererObject {
+
+	public function render($o) {
+		$ex	= $o;
+		$fullTrace = $this->getExceptionAsString($ex);
+		while (method_exists($ex, 'getPrevious')) {
+			$ex	= $ex->getPrevious();
+			if ($ex !== null && $ex instanceof Exception) {
+				$fullTrace .= sprintf('%s%s: %s', PHP_EOL, 'Caused by', $this->getExceptionAsString($ex));
+			}
+		}		
+		return $fullTrace;
+	}
+	
+	protected function getExceptionAsString(Exception $ex) {
+		return sprintf('%s: %s%s%s' ,get_class($ex), $ex->getMessage(), PHP_EOL, $ex->getTraceAsString());		  
+	}
+}
+?>
\ No newline at end of file

Modified: logging/log4php/trunk/src/test/php/LoggerLoggingEventTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/LoggerLoggingEventTest.php?rev=937159&r1=937158&r2=937159&view=diff
==============================================================================
--- logging/log4php/trunk/src/test/php/LoggerLoggingEventTest.php (original)
+++ logging/log4php/trunk/src/test/php/LoggerLoggingEventTest.php Fri Apr 23 05:20:19 2010
@@ -40,13 +40,15 @@ class LoggerLoggingEventTestCaseLayout e
 	}
         
 	public function format(LoggerLoggingEvent $event) {
-		LoggerLoggingEventTest::$locationInfo = $event->getLocationInformation();
+		LoggerLoggingEventTest::$locationInfo  = $event->getLocationInformation();
+        LoggerLoggingEventTest::$throwableInfo = $event->getThrowableInformation();
 	}
 }
 
 class LoggerLoggingEventTest extends PHPUnit_Framework_TestCase {
         
 	public static $locationInfo;
+    public static $throwableInfo;
 
 	public function testConstructWithLoggerName() {
 		$l = LoggerLevel :: getLevelDebug();
@@ -89,5 +91,43 @@ class LoggerLoggingEventTest extends PHP
 		self::assertEquals($li->getMethodName(), __FUNCTION__);
 
 	}
-
+	
+	public function testGetThrowableInformation1() {
+		$hierarchy = Logger::getHierarchy();
+		$root	   = $hierarchy->getRootLogger();
+		
+		$a = new LoggerLoggingEventTestCaseAppender('A1');
+		$a->setLayout( new LoggerLoggingEventTestCaseLayout() );
+		$root->addAppender($a);
+				
+		$logger = $hierarchy->getLogger('test');
+		$logger->debug('test');
+		$hierarchy->shutdown();
+		
+		$ti = self::$throwableInfo;
+		
+		self::assertEquals($ti, null);				  
+	}
+	
+	public function testGetThrowableInformation2() {
+		$hierarchy = Logger::getHierarchy();
+		$root	   = $hierarchy->getRootLogger();
+		
+		$a = new LoggerLoggingEventTestCaseAppender('A1');
+		$a->setLayout( new LoggerLoggingEventTestCaseLayout() );
+		$root->addAppender($a);
+				
+		$ex		= new Exception('Message1');
+		$logger = $hierarchy->getLogger('test');
+		$logger->debug('test', $ex);
+		$hierarchy->shutdown();
+		
+		$ti = self::$throwableInfo;
+		
+		self::assertTrue($ti instanceof LoggerThrowableInformation);				
+		
+		$expected = array('Message1');
+		$result	   = $ti->getStringRepresentation();
+		self::assertEquals($expected, $result);
+	}
 }

Added: logging/log4php/trunk/src/test/php/LoggerThrowableInformationTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/LoggerThrowableInformationTest.php?rev=937159&view=auto
==============================================================================
--- logging/log4php/trunk/src/test/php/LoggerThrowableInformationTest.php (added)
+++ logging/log4php/trunk/src/test/php/LoggerThrowableInformationTest.php Fri Apr 23 05:20:19 2010
@@ -0,0 +1,103 @@
+<?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
+ * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version    SVN: $Id$
+ * @link       http://logging.apache.org/log4php
+ */
+
+class LoggerThrowableInformationTest extends PHPUnit_Framework_TestCase {
+	
+	public function testConstructor1() {
+		$rep  = array(
+			'Message1',
+			'Message2',
+			'Message3'
+		);		  
+		$tInfo	  = new LoggerThrowableInformation($rep);
+		
+		$expected = $rep;
+		$result	  = $tInfo->getStringRepresentation();
+		$this->assertEquals($expected, $result);
+	}
+	
+	public function testConstructor2() {
+		$ex	   = new LoggerThrowableInformationTestException('Message1');
+		$tInfo = new LoggerThrowableInformation($ex);
+		
+		$expected = array('Message1');
+		$result	  = $tInfo->getStringRepresentation();
+		$this->assertEquals($expected, $result);
+	}
+	
+	public function testConstructor3() {
+		$ex		= new LoggerThrowableInformationTestException('Message1');
+		$logger = Logger::getLogger('test');
+		$tInfo	= new LoggerThrowableInformation($ex, $logger);
+		
+		$expected = array('Message1');
+		$result	  = $tInfo->getStringRepresentation();
+		$this->assertEquals($expected, $result);	  
+	}
+	
+	public function testInvalidConstructor() {
+		try {
+			$tInfo = new LoggerThrowableInformation('test');
+		} catch (InvalidArgumentException $ex) {
+			return;
+		}
+		
+		$this->fail('Invalid constructor params should raise Exception');
+	}
+	
+	public function testExceptionChain() {
+		$ex1 = new LoggerThrowableInformationTestException('Message1');
+		$ex2 = new LoggerThrowableInformationTestException('Message2', 0, $ex1);
+		$ex3 = new LoggerThrowableInformationTestException('Message3', 0, $ex2);
+
+		$tInfo	  = new LoggerThrowableInformation($ex3);
+		$expected = array(
+			'Message3',
+			'Message2',
+			'Message1'
+		);
+		$result	 = $tInfo->getStringRepresentation();
+		$this->assertEquals($expected, $result);
+	}
+}
+
+
+if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
+	class LoggerThrowableInformationTestException extends Exception { }
+} else {
+	class LoggerThrowableInformationTestException extends Exception {
+		
+		protected $previous;
+		
+		public function __construct($message = '', $code = 0, Exception $previous = null) {
+			parent::__construct($message, $code);
+			$this->previous = $previous;
+		}
+		
+		public function getPrevious() {
+			return $this->previous;
+		}
+	}
+}
+?>
\ No newline at end of file

Added: logging/log4php/trunk/src/test/php/renderers/LoggerRendererExceptionTest.php
URL: http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/renderers/LoggerRendererExceptionTest.php?rev=937159&view=auto
==============================================================================
--- logging/log4php/trunk/src/test/php/renderers/LoggerRendererExceptionTest.php (added)
+++ logging/log4php/trunk/src/test/php/renderers/LoggerRendererExceptionTest.php Fri Apr 23 05:20:19 2010
@@ -0,0 +1,71 @@
+<?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 renderers
+ * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
+ * @version    SVN: $Id$
+ * @link       http://logging.apache.org/log4php
+ */
+
+class LoggerRendererExceptionTest extends PHPUnit_Framework_TestCase {
+	
+	public function testRender() {
+		$exRenderer = new LoggerRendererException();
+		$ex1		= new LoggerRendererExceptionTestException('Message1');
+		$ex2		= new LoggerRendererExceptionTestException('Message2', 0, $ex1);
+		$ex3		= new LoggerRendererExceptionTestException('Message3', 0, $ex2);
+		
+        $rendered   = $exRenderer->render($ex3);
+        
+		$expected	= 3;        
+		$result		= substr_count($rendered, 'LoggerRendererExceptionTestException: Message');		
+		$this->assertEquals($expected, $result);		
+        
+        $expected   = 2;        
+        $result     = substr_count($rendered, 'Caused by: LoggerRendererExceptionTestException:');        
+        $this->assertEquals($expected, $result);
+        
+        $expected   = 1;        
+        $result     = substr_count($rendered, 'Caused by: LoggerRendererExceptionTestException: Message2');        
+        $this->assertEquals($expected, $result);
+
+        $expected   = 1;        
+        $result     = substr_count($rendered, 'Caused by: LoggerRendererExceptionTestException: Message1');        
+        $this->assertEquals($expected, $result);                
+	}
+}
+
+if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
+	class LoggerRendererExceptionTestException extends Exception { }
+} else {
+	class LoggerRendererExceptionTestException extends Exception {
+		
+		protected $previous;
+		
+		public function __construct($message = '', $code = 0, Exception $previous = null) {
+			parent::__construct($message, $code);
+			$this->previous = $previous;
+		}
+		
+		public function getPrevious() {
+			return $this->previous;
+		}	 
+	}
+}
+?>
\ No newline at end of file