Author: grobmeier
Date: Wed Jun  1 09:04:42 2011
New Revision: 1130064

URL: http://svn.apache.org/viewvc?rev=1130064&view=rev
Log:
LOG4PHP-138: when a log files rolls over, all other appenders need a 
notification for the new location of the file. Besides that, while rolling 
over, all other appenders need to wait for this action to be completed.

Modified:
    logging/log4php/trunk/src/changes/changes.xml
    logging/log4php/trunk/src/main/php/Logger.php
    logging/log4php/trunk/src/main/php/appenders/LoggerAppenderRollingFile.php
    
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderRollingFileTest.php

Modified: logging/log4php/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/changes/changes.xml?rev=1130064&r1=1130063&r2=1130064&view=diff
==============================================================================
--- logging/log4php/trunk/src/changes/changes.xml (original)
+++ logging/log4php/trunk/src/changes/changes.xml Wed Jun  1 09:04:42 2011
@@ -22,6 +22,8 @@
        </properties>
        <body>
                <release version="2.1" date="SVN" description="Stabilizing">
+                       <action date="2011-06-01" type="fix" 
issue="LOG4PHP-138" dev="Christian Grobmeier">Permission denied while renaming 
log file when hundred of users are accessing the application
+</action>
                        <action date="2011-05-28" type="fix" 
issue="LOG4PHP-140" dev="Ivan Habunek">Fixed incorrect usage of 
changes.xml</action>
                        <action date="2011-05-28" type="fix" 
issue="LOG4PHP-129" dev="Ivan Habunek">Log4PHP causes odd errors in the 
underlying application if used with source having an existing __autoload 
function</action>
                        <action date="2011-05-20" type="fix" 
issue="LOG4PHP-122" dev="Ivan Habunek" due-to="Moritz Schmidt" 
due-to-email="fusselwurm at gmail dot com">RendererMap::getByClassName doesnt 
recognize instances of child classes</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=1130064&r1=1130063&r2=1130064&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/Logger.php (original)
+++ logging/log4php/trunk/src/main/php/Logger.php Wed Jun  1 09:04:42 2011
@@ -371,6 +371,14 @@ class Logger {
        }
        
        /**
+        * Returns all currently defined loggers
+        * @return all currently defined logger instances
+        */
+       public static function getAllLoggers() {
+               return self::getHierarchy()->getCurrentLoggers();
+       }
+       
+       /**
         * get the Root Logger (Delegate to {@link Logger})
         * @return LoggerRoot
         * @static 

Modified: 
logging/log4php/trunk/src/main/php/appenders/LoggerAppenderRollingFile.php
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/appenders/LoggerAppenderRollingFile.php?rev=1130064&r1=1130063&r2=1130064&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/appenders/LoggerAppenderRollingFile.php 
(original)
+++ logging/log4php/trunk/src/main/php/appenders/LoggerAppenderRollingFile.php 
Wed Jun  1 09:04:42 2011
@@ -140,8 +140,8 @@ class LoggerAppenderRollingFile extends 
                }
                
                //unset($this->fp);
+               $this->setFile($fileName);
                $this->activateOptions();
-               $this->setFile($fileName, false);
        }
        
        public function setFile($fileName) {
@@ -222,11 +222,40 @@ class LoggerAppenderRollingFile extends 
         */
        public function append(LoggerLoggingEvent $event) {
                parent::append($event);
-               if(ftell($this->fp) > $this->getMaxFileSize()) {
-                       $this->rollOver();
+               if(ftell($this->fp) > $this->getMaxFileSize()) { 
+                       if(flock($this->fp, LOCK_EX)) { 
+                               if(ftell($this->fp) > $this->getMaxFileSize()) 
{ 
+                                       $this->rollOver(); 
+                                       $this->updateLoggers();
+                               }
+                       }
                }
        }
        
+       /**
+        * Iterates through all loggers and updates all appenders with a new 
file name
+        */
+       private function updateLoggers() {
+               $appenders = Logger::getRootLogger()->getAllAppenders();
+               $this->updateAppenders($appenders);
+               $loggers = Logger::getAllLoggers();
+               foreach($loggers as $logger) {
+                       $appenders = $logger->getAllAppenders();
+                       $this->updateAppenders($appenders);
+               }
+       }
+
+       /**
+        * Updates all appenders with a new file name
+        */
+       private function updateAppenders($appenders) {
+               foreach($appenders as $appender) {
+                       if($appender instanceof LoggerAppenderRollingFile) {
+                               $appender->setFile($this->getFile());
+                               $appender->activateOptions();
+                       }
+               }
+       }
        
        /**
         * @return Returns the maximum number of backup files to keep around.

Modified: 
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderRollingFileTest.php
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/appenders/LoggerAppenderRollingFileTest.php?rev=1130064&r1=1130063&r2=1130064&view=diff
==============================================================================
--- 
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderRollingFileTest.php 
(original)
+++ 
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderRollingFileTest.php 
Wed Jun  1 09:04:42 2011
@@ -140,6 +140,54 @@ class LoggerAppenderRollingFileTest exte
                        self::assertTrue(false);
                }
        }
+       
+       public function testLoggingViaLogger() {
+               $logger = Logger::getLogger('mycat');
+               $logger->setAdditivity(false);
+               $layout = new LoggerLayoutSimple();
+
+               $appender = new LoggerAppenderRollingFile("mylogger");
+               $appender->setFile($this->dir.'/TEST-rolling.txt');
+               $appender->setLayout($layout);
+               $appender->setMaxFileSize('1KB');
+               $appender->setMaxBackupIndex(2);
+               $appender->activateOptions();
+
+               $logger->addAppender($appender);
+               
+               for($i = 0; $i < 1000; $i++) {
+                       $logger->warn("my message123");
+               }
+               
+               $logger->warn("my messageXYZ");
+               
+               $file = $this->dir.'/TEST-rolling.txt';
+               $data = file($file);
+               
+               $line = $data[count($data)-1];
+               $e = "WARN - my messageXYZ".PHP_EOL;
+               self::assertEquals($e, $line);
+
+               $file = $this->dir.'/TEST-rolling.txt.1';
+               $data = file($file);
+               $line = $data[count($data)-1];
+               $e = "WARN - my message123".PHP_EOL;
+               foreach($data as $r) {
+                       self::assertEquals($e, $r);
+               }
+
+               $file = $this->dir.'/TEST-rolling.txt.2';
+               $data = file($file);
+               $line = $data[count($data)-1];
+               $e = "WARN - my message123".PHP_EOL;
+               foreach($data as $r) {
+                       self::assertEquals($e, $r);
+               }
+
+               if(file_exists($this->dir.'/TEST-rolling.txt.3')) {
+                       self::assertTrue(false);
+               }
+       }
 
        protected function tearDown() {
                @unlink($this->dir.'/TEST-rolling.txt');


Reply via email to