[logback-dev] [GIT] Logback: the generic, reliable, fast and flexible logging framework. branch master updated. v_1.0.0-48-g14125a6

Gitbot git-noreply at pixie.qos.ch
Tue Nov 8 20:15:58 CET 2011


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".

The branch, master has been updated
       via  14125a6b372f8191fb8ab03e1f3838aab642f2ae (commit)
      from  458cf00deffe60253799f5c6f6d1ff5954309c80 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=14125a6b372f8191fb8ab03e1f3838aab642f2ae
http://github.com/ceki/logback/commit/14125a6b372f8191fb8ab03e1f3838aab642f2ae

commit 14125a6b372f8191fb8ab03e1f3838aab642f2ae
Author: Ceki Gulcu <ceki at qos.ch>
Date:   Tue Nov 8 20:15:24 2011 +0100

    test LBCORE-226

diff --git a/logback-core/src/main/java/ch/qos/logback/core/ContextBase.java b/logback-core/src/main/java/ch/qos/logback/core/ContextBase.java
index 0f61df4..cd58377 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/ContextBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/ContextBase.java
@@ -134,4 +134,9 @@ public class ContextBase implements Context {
   public ExecutorService getExecutorService() {
     return  executorService;
   }
+
+  @Override
+  public String toString() {
+    return name;
+  }
 }
diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java
index 0981f1f..0908a2f 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java
@@ -93,6 +93,7 @@ public class TimeBasedRollingPolicy<E> extends RollingPolicyBase implements
       archiveRemover = timeBasedFileNamingAndTriggeringPolicy.getArchiveRemover();
       archiveRemover.setMaxHistory(maxHistory);
       if(cleanHistoryOnStart) {
+        addInfo("Cleaning on start up");
         archiveRemover.clean(new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime()));
       }
     }
diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DefaultArchiveRemover.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DefaultArchiveRemover.java
index 352f5ac..85b494a 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DefaultArchiveRemover.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DefaultArchiveRemover.java
@@ -46,6 +46,7 @@ abstract public class DefaultArchiveRemover extends ContextAwareBase implements
   int computeElapsedPeriodsSinceLastClean(long nowInMillis) {
     long periodsElapsed = 0;
     if (lastHeartBeat == UNINITIALIZED) {
+      addInfo("first clean up after appender initialization");
       periodsElapsed = rc.periodsElapsed(nowInMillis, nowInMillis + INACTIVITY_TOLERANCE_IN_MILLIS);
       if (periodsElapsed > MAX_VALUE_FOR_INACTIVITY_PERIODS)
         periodsElapsed = MAX_VALUE_FOR_INACTIVITY_PERIODS;
@@ -67,7 +68,6 @@ abstract public class DefaultArchiveRemover extends ContextAwareBase implements
       addInfo("periodsElapsed = " + periodsElapsed);
     }
     for (int i = 0; i < periodsElapsed; i++) {
-      if (periodsElapsed > 1) addInfo("i = " + i);
       cleanByPeriodOffset(now, periodOffsetForDeletionTarget - i);
     }
   }
diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java
index 2c65c41..0a2a90b 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java
@@ -35,4 +35,8 @@ public class TimeBasedArchiveRemover extends DefaultArchiveRemover {
       }
     }
   }
+
+  public String toString() {
+    return "c.q.l.core.rolling.helper.TimeBasedArchiveRemover";
+  }
 }
diff --git a/logback-core/src/test/scala/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemoval_STest.scala b/logback-core/src/test/scala/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemoval_STest.scala
index f392cdf..8a5d8ab 100644
--- a/logback-core/src/test/scala/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemoval_STest.scala
+++ b/logback-core/src/test/scala/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemoval_STest.scala
@@ -61,7 +61,7 @@ class TimeBasedRollingWithArchiveRemoval_STest {
     val numPeriods: Int = 40
     val maxHistory: Int = 2
     val fileNamePattern = randomOutputDir + "/%d{" + MONTHLY_CRONOLOG_DATE_PATTERN + "}/clean.txt.zip"
-    val (startTime, endTime) = doRollover(now, fileNamePattern, MILLIS_IN_MONTH, maxHistory, numPeriods)
+    val (startTime, endTime) = logOverMultiplePeriods(now, fileNamePattern, MILLIS_IN_MONTH, maxHistory, numPeriods)
     val differenceInMonths = RollingCalendar.diffInMonths(startTime, endTime)
     val startTimeAsCalendar = Calendar.getInstance()
     startTimeAsCalendar.setTimeInMillis(startTime)
@@ -81,7 +81,7 @@ class TimeBasedRollingWithArchiveRemoval_STest {
 
   def generateDailyRollover(now: Long, maxHistory: Int, simulatedNumberOfPeriods: Int, startInactivity: Int, numInactivityPeriods: Int) {
     slashCount = computeSlashCount(DAILY_DATE_PATTERN)
-    doRollover(now, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods)
+    logOverMultiplePeriods(now, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods)
     //StatusPrinter.print(context)
     check(expectedCountWithoutFoldersWithInactivity(maxHistory, simulatedNumberOfPeriods, startInactivity + numInactivityPeriods))
   }
@@ -110,15 +110,15 @@ class TimeBasedRollingWithArchiveRemoval_STest {
     slashCount = computeSlashCount(DAILY_DATE_PATTERN)
     val maxHistory = 5
     val simulatedNumberOfPeriods = maxHistory * 2
-    val (startTime, endTime) = doRollover(now, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, maxHistory * 2)
-    doRollover(endTime + MILLIS_IN_DAY * 10, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, maxHistory)
+    val (startTime, endTime) = logOverMultiplePeriods(now, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, maxHistory * 2)
+    logOverMultiplePeriods(endTime + MILLIS_IN_DAY * 10, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, maxHistory)
     check(expectedCountWithoutFolders(maxHistory))
   }
 
 
   @Test def dailyCronologRollover {
     slashCount = computeSlashCount(DAILY_CRONOLOG_DATE_PATTERN)
-    doRollover(now, randomOutputDir + "/%d{" + DAILY_CRONOLOG_DATE_PATTERN + "}/clean.txt.zip", MILLIS_IN_DAY, 8, 8 * 3)
+    logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_CRONOLOG_DATE_PATTERN + "}/clean.txt.zip", MILLIS_IN_DAY, 8, 8 * 3)
     var expectedDirMin: Int = 9 + slashCount
     var expectDirMax: Int = expectedDirMin + 1 + 1
     expectedFileAndDirCount(9, expectedDirMin, expectDirMax)
@@ -129,7 +129,7 @@ class TimeBasedRollingWithArchiveRemoval_STest {
     sizeAndTimeBasedFNATP.setMaxFileSize("10000")
     tbfnatp = sizeAndTimeBasedFNATP
     slashCount = computeSlashCount(DAILY_DATE_PATTERN)
-    doRollover(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}-clean.%i.zip", MILLIS_IN_DAY, 5, 5 * 4)
+    logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}-clean.%i.zip", MILLIS_IN_DAY, 5, 5 * 4)
     checkPatternCompliance(5 + 1 + slashCount, "\\d{4}-\\d{2}-\\d{2}-clean(\\.\\d)(.zip)?")
   }
 
@@ -138,7 +138,7 @@ class TimeBasedRollingWithArchiveRemoval_STest {
     sizeAndTimeBasedFNATP.setMaxFileSize("10000")
     tbfnatp = sizeAndTimeBasedFNATP
     slashCount = 1
-    doRollover(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i.zip", MILLIS_IN_DAY, 5, 5 * 4)
+    logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i.zip", MILLIS_IN_DAY, 5, 5 * 4)
     checkDirPatternCompliance(6)
   }
 
@@ -149,21 +149,28 @@ class TimeBasedRollingWithArchiveRemoval_STest {
     slashCount = 1
     val maxHistory = 5
     val simulatedNumberOfPeriods = maxHistory * 4
-    val (startTime, endTime) = doRollover(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i", MILLIS_IN_DAY, maxHistory, 3)
-    doRollover(endTime + MILLIS_IN_DAY * 7, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i", MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods)
+    val (startTime, endTime) = logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i", MILLIS_IN_DAY, maxHistory, 3)
+    logOverMultiplePeriods(endTime + MILLIS_IN_DAY * 7, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i", MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods)
     checkDirPatternCompliance(maxHistory + 1)
   }
 
 
-  // this test requires changing the current working directory which is impossible in Java
-  @Ignore
-  @Test def dailyChronologSizeBasedRolloverWhenLogFilenameDoesNotContainDirectory: Unit = {
-    var sizeAndTimeBasedFNATP: SizeAndTimeBasedFNATP[AnyRef] = new SizeAndTimeBasedFNATP[AnyRef]
-    sizeAndTimeBasedFNATP.setMaxFileSize("10000")
-    tbfnatp = sizeAndTimeBasedFNATP
-    slashCount = 1
-    doRollover(now, "clean.%d{" + DAILY_DATE_PATTERN + "}.%i.zip", MILLIS_IN_DAY, 5, 5 * 4)
-    checkDirPatternCompliance(6)
+  def logOncePeriod(currentTime: Long, fileNamePattern: String, maxHistory: Int) = {
+    val (rfa, tbrp) = buildRollingFileAppender(currentTime, fileNamePattern, maxHistory, true)
+    rfa.doAppend("Hello ----------------------------------------------------------" + new Date(currentTime))
+    rfa.stop()
+  }
+
+  @Test def cleanHistoryOnStart {
+    var now = this.now
+    val fileNamePattern = randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt"
+    val maxHistory = 3
+    for (i <- 0 to 5) {
+      logOncePeriod(now, fileNamePattern, maxHistory)
+      now = now + MILLIS_IN_DAY
+    }
+    StatusPrinter.print(context)
+    check(expectedCountWithoutFolders(maxHistory))
   }
 
   def extraFolder(numPeriods: Int, periodsPerEra: Int, beginPeriod: Int, maxHistory: Int): Boolean = {
@@ -183,10 +190,8 @@ class TimeBasedRollingWithArchiveRemoval_STest {
     }
   }
 
-  def doRollover(currentTime: Long, fileNamePattern: String, periodDurationInMillis: Long, maxHistory: Int,
-                 simulatedNumberOfPeriods: Int, startInactivity: Int = 0,
-                 numInactivityPeriods: Int = 0): (Long, Long) = {
-    val startTime = currentTime
+  def buildRollingFileAppender(currentTime: Long, fileNamePattern: String, maxHistory: Int,
+                               cleanHistoryOnStart: Boolean = false): (RollingFileAppender[AnyRef], TimeBasedRollingPolicy[AnyRef]) = {
     val rfa: RollingFileAppender[AnyRef] = new RollingFileAppender[AnyRef]
     rfa.setContext(context)
     rfa.setEncoder(encoder)
@@ -195,11 +200,20 @@ class TimeBasedRollingWithArchiveRemoval_STest {
     tbrp.setFileNamePattern(fileNamePattern)
     tbrp.setMaxHistory(maxHistory)
     tbrp.setParent(rfa)
+    tbrp.setCleanHistoryOnStart(cleanHistoryOnStart)
     tbrp.timeBasedFileNamingAndTriggeringPolicy = tbfnatp
     tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime)
     tbrp.start
     rfa.setRollingPolicy(tbrp)
     rfa.start
+    (rfa, tbrp)
+  }
+
+  def logOverMultiplePeriods(currentTime: Long, fileNamePattern: String, periodDurationInMillis: Long, maxHistory: Int,
+                 simulatedNumberOfPeriods: Int, startInactivity: Int = 0,
+                 numInactivityPeriods: Int = 0): (Long, Long) = {
+    val startTime = currentTime
+    val (rfa, tbrp) = buildRollingFileAppender(currentTime, fileNamePattern, maxHistory)
     val ticksPerPeriod: Int = 512
     val runLength = simulatedNumberOfPeriods * ticksPerPeriod
     val startInactivityIndex: Int = 1 + startInactivity * ticksPerPeriod
diff --git a/logback-site/src/site/pages/manual/appenders.html b/logback-site/src/site/pages/manual/appenders.html
index 0d997d7..130aebc 100644
--- a/logback-site/src/site/pages/manual/appenders.html
+++ b/logback-site/src/site/pages/manual/appenders.html
@@ -818,6 +818,24 @@ public interface RollingPolicy extends LifeCycle {
        archiving will be removed as appropriate.
        </td>
      </tr>
+
+     <tr  class="b">
+       <td><span class="option"><b>cleanHistoryOnStart</b></span></td>
+       <td>boolean</td>
+       <td>
+         <p>If set to true, archive removal will be executed on
+         appender start up. By default this property is set to
+         false. </p>
+
+         <p>Archive removal is normally performed during roll
+         over. However, some applications may not live long enough for
+         roll over to be triggered. It follows that for such
+         short-lived applications archive removal may never get a
+         chance to execute.  By setting <span
+         class="option">cleanHistoryOnStart</span> to true, archive
+         removal is performed at appender start up.</p>
+       </td>
+     </tr>
    </table>
 
 
diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html
index 91ec85f..030ada1 100644
--- a/logback-site/src/site/pages/news.html
+++ b/logback-site/src/site/pages/news.html
@@ -31,6 +31,17 @@
 
     <h3>xx of November, 2011 - Release of version 1.0.1</h3>
 
+    <p>Added new property the <span
+    class="option">cleanHistoryOnStart</span> to <a
+    href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>.
+    By setting this property to <code>true</code>, history removal
+    will work as expected even in the case of short lived
+    applications. This fixes <a
+    href="http://jira.qos.ch/browse/LBCORE-226">LBCORE-226</a>
+    reported by Bruce E. Irving.
+    </p>
+
+
     <p><code>RequestLogImpl</code> can now lookup for the
     logback-access configuration file as a class path resource. This
     feature was requested in <a

-----------------------------------------------------------------------

Summary of changes:
 .../main/java/ch/qos/logback/core/ContextBase.java |    5 ++
 .../core/rolling/TimeBasedRollingPolicy.java       |    1 +
 .../core/rolling/helper/DefaultArchiveRemover.java |    2 +-
 .../rolling/helper/TimeBasedArchiveRemover.java    |    4 ++
 .../TimeBasedRollingWithArchiveRemoval_STest.scala |   58 ++++++++++++--------
 logback-site/src/site/pages/manual/appenders.html  |   18 ++++++
 logback-site/src/site/pages/news.html              |   11 ++++
 7 files changed, 76 insertions(+), 23 deletions(-)


hooks/post-receive
-- 
Logback: the generic, reliable, fast and flexible logging framework.


More information about the logback-dev mailing list