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');