
Author: ceki Date: Mon Aug 3 15:23:38 2009 New Revision: 2405 Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP.java - copied, changed from r2404, /logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicy.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DatePatternToRegex.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SDFToken.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java - copied, changed from r2404, /logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicyTest.java Removed: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicy.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicyTest.java Modified: logback/trunk/logback-classic/src/test/input/joran/rolling/timeAndSize.xml logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DateTokenConverter.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java Log: ongoing work Modified: logback/trunk/logback-classic/src/test/input/joran/rolling/timeAndSize.xml ============================================================================== --- logback/trunk/logback-classic/src/test/input/joran/rolling/timeAndSize.xml (original) +++ logback/trunk/logback-classic/src/test/input/joran/rolling/timeAndSize.xml Mon Aug 3 15:23:38 2009 @@ -9,7 +9,7 @@ ${randomOutputDir}${testId}-%d{yyyy-MM-dd_HH_mm_ss}.%i </FileNamePattern> <TimeBasedFileNamingAndTriggeringPolicy - class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy"> + class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <MaxFileSize>${sizeThreshold}</MaxFileSize> </TimeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java Mon Aug 3 15:23:38 2009 @@ -1,3 +1,12 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ package ch.qos.logback.classic.rolling; import static org.junit.Assert.assertTrue; @@ -28,7 +37,7 @@ int fileSize = 0; int fileIndexCounter = -1; int sizeThreshold; - + @Before @Override public void setUp() { @@ -53,23 +62,23 @@ public void basic() throws Exception { String testId = "basic"; lc.putProperty("testId", testId); - loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "/rolling/"+testId+".xml"); + loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "/rolling/" + testId + + ".xml"); StatusChecker sc = new StatusChecker(lc); assertTrue(sc.isErrorFree()); - + Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); - - expectedFilenameList.add(randomOutputDir+"z"+testId); - + + expectedFilenameList.add(randomOutputDir + "z" + testId); + RollingFileAppender<ILoggingEvent> rfa = (RollingFileAppender<ILoggingEvent>) root .getAppender("ROLLING"); TimeBasedRollingPolicy tprp = (TimeBasedRollingPolicy<ILoggingEvent>) rfa .getTriggeringPolicy(); - TimeBasedFileNamingAndTriggeringPolicy tbnatp = tprp.getTimeBasedFileNamingAndTriggeringPolicy(); - + TimeBasedFileNamingAndTriggeringPolicy tbnatp = tprp + .getTimeBasedFileNamingAndTriggeringPolicy(); - String prefix = "Hello---"; int runLength = 4; for (int i = 0; i < runLength; i++) { @@ -80,38 +89,39 @@ } existenceCheck(expectedFilenameList); - sortedContentCheck(randomOutputDir, runLength, prefix); + sortedContentCheck(randomOutputDir, runLength, prefix); } - + @Test public void timeAndSize() throws Exception { String testId = "timeAndSize"; lc.putProperty("testId", testId); String prefix = "Hello-----"; - int hits = 64; - sizeThreshold = prefix.length()*hits; - lc.putProperty("sizeThreshold", ""+sizeThreshold); - loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "/rolling/"+testId+".xml"); + + // the number of times the log file will be written to before time based + // roll-over occurs + int approxWritesPerPeriod = 64; + sizeThreshold = prefix.length() * approxWritesPerPeriod; + lc.putProperty("sizeThreshold", "" + sizeThreshold); + loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "/rolling/" + testId + + ".xml"); Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); - - expectedFilenameList.add(randomOutputDir+"z"+testId); - + expectedFilenameList.add(randomOutputDir + "z" + testId); + RollingFileAppender<ILoggingEvent> rfa = (RollingFileAppender<ILoggingEvent>) root .getAppender("ROLLING"); StatusChecker sc = new StatusChecker(lc); assertTrue(sc.isErrorFree()); - TimeBasedRollingPolicy tprp = (TimeBasedRollingPolicy<ILoggingEvent>) rfa .getTriggeringPolicy(); - TimeBasedFileNamingAndTriggeringPolicy tbnatp = tprp.getTimeBasedFileNamingAndTriggeringPolicy(); - + TimeBasedFileNamingAndTriggeringPolicy tbnatp = tprp + .getTimeBasedFileNamingAndTriggeringPolicy(); - - int timeIncrement = 1000/hits; - int runLength = (1000/timeIncrement)*3; + int timeIncrement = 1000 / approxWritesPerPeriod; + int runLength = approxWritesPerPeriod * 3; for (int i = 0; i < runLength; i++) { String msg = prefix + i; logger.debug(msg); @@ -120,12 +130,16 @@ tbnatp.setCurrentTime(currentTime); } - sortedContentCheck(randomOutputDir, runLength, prefix); + sortedContentCheck(randomOutputDir, runLength, prefix); int eCount = existenceCount(expectedFilenameList); - assertTrue("eCount="+eCount+"expectedFilenameList.size="+expectedFilenameList.size(), eCount >= 5 && eCount > expectedFilenameList.size()/2); + // for various reasons, it is extremely difficult to have the files + // match exactly the expected archive files. Thus, we aim for + // an approximate match + assertTrue("eCount=" + eCount + "expectedFilenameList.size=" + + expectedFilenameList.size(), eCount >= 5 + && eCount > expectedFilenameList.size() / 2); } - - + void addExpectedFileNamedIfItsTime(String testId, String msg, boolean gzExtension) { fileSize += msg.getBytes().length; @@ -154,15 +168,16 @@ String fn = randomOutputDir + testId + "-" + SDF.format(date) + "." + fileIndexCounter; - System.out.println("Adding "+fn); + System.out.println("Adding " + fn); if (gzExtension) { fn += ".gz"; } expectedFilenameList.add(fn); } - + @Override - protected void addExpectedFileNamedIfItsTime_ByDate(String testId, boolean gzExtension) { + protected void addExpectedFileNamedIfItsTime_ByDate(String testId, + boolean gzExtension) { if (passThresholdTime(nextRolloverThreshold)) { addExpectedFileName_ByDate(testId, getDateOfPreviousPeriodsStart(), gzExtension); Copied: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP.java (from r2404, /logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicy.java) ============================================================================== --- /logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicy.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP.java Mon Aug 3 15:23:38 2009 @@ -16,7 +16,7 @@ import ch.qos.logback.core.util.FileSize; @NoAutoStart -public class SizeAndTimeBasedFileNamingAndTriggeringPolicy<E> extends +public class SizeAndTimeBasedFNATP<E> extends TimeBasedFileNamingAndTriggeringPolicyBase<E> { int currentPeriodsCounter = 0; Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DatePatternToRegex.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DatePatternToRegex.java Mon Aug 3 15:23:38 2009 @@ -0,0 +1,47 @@ +package ch.qos.logback.core.rolling.helper; + +import java.util.ArrayList; +import java.util.List; + +public class DatePatternToRegex { + + final String datePattern; + final int length; + + DatePatternToRegex(String datePattern) { + this.datePattern = datePattern; + length = datePattern.length(); + } + + public String toRegex(String datePattern) { + List<SDFToken> tokenList = tokenize(); + for(SDFToken token: tokenList) { + + } + char c = 0; + for (int i = 0; i < length; i++) { + char t = 1; + } + return null; + } + + List<SDFToken> tokenize() { + List<SDFToken> tokenList = new ArrayList<SDFToken>(); + SDFToken token = null; + for (int i = 0; i < length; i++) { + char t = datePattern.charAt(i); + if (token == null || token.c != t) { + token = addNewToken(tokenList, t); + } else { + token.inc(); + } + } + return tokenList; + } + + SDFToken addNewToken(List<SDFToken> tokenList, char t) { + SDFToken token = new SDFToken(t); + tokenList.add(token); + return token; + } +} Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DateTokenConverter.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DateTokenConverter.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DateTokenConverter.java Mon Aug 3 15:23:38 2009 @@ -66,6 +66,9 @@ return (o instanceof Date); } + String toRegex() { + return null; + } /** * Set the date pattern. */ Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java Mon Aug 3 15:23:38 2009 @@ -10,12 +10,14 @@ package ch.qos.logback.core.rolling.helper; +import java.util.Date; import java.util.HashMap; import java.util.Map; import ch.qos.logback.core.Context; import ch.qos.logback.core.pattern.Converter; import ch.qos.logback.core.pattern.ConverterUtil; +import ch.qos.logback.core.pattern.LiteralConverter; import ch.qos.logback.core.pattern.parser.Node; import ch.qos.logback.core.pattern.parser.Parser; import ch.qos.logback.core.pattern.parser.ScanException; @@ -136,4 +138,22 @@ public String getPattern() { return pattern; } + + + // Given date, convert this instance to a regular expression + String asRegex(Date date) { + StringBuilder buf = new StringBuilder(); + Converter<Object> p = headTokenConverter; + while (p != null) { + if(p instanceof LiteralConverter) { + buf.append(p.convert(null)); + } else if (p instanceof IntegerTokenConverter) { + buf.append("\\d{1,2}"); + } else if(p instanceof DateTokenConverter) { + buf.append(p.convert(date)); + } + p = p.getNext(); + } + return buf.toString(); + } } Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SDFToken.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SDFToken.java Mon Aug 3 15:23:38 2009 @@ -0,0 +1,18 @@ +/** + * + */ +package ch.qos.logback.core.rolling.helper; + +class SDFToken { + final char c; + int occurrences; + + public SDFToken(char c) { + this.c = c; + this.occurrences = 1; + } + + void inc() { + occurrences++; + } +} \ No newline at end of file Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java Mon Aug 3 15:23:38 2009 @@ -7,7 +7,7 @@ @Suite.SuiteClasses( { RenamingTest.class, SizeBasedRollingTest.class, TimeBasedRollingTest.class, TimeBasedRollingWithCleanTest.class, MultiThreadedRollingTest.class, - SizeAndTimeBasedFileNamingAndTriggeringPolicyTest.class, + SizeAndTimeBasedFNATP_Test.class, ch.qos.logback.core.rolling.helper.PackageTest.class }) public class PackageTest { } Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java Mon Aug 3 15:23:38 2009 @@ -1,3 +1,12 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ package ch.qos.logback.core.rolling; import static org.junit.Assert.assertEquals; Copied: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java (from r2404, /logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicyTest.java) ============================================================================== --- /logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFileNamingAndTriggeringPolicyTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java Mon Aug 3 15:23:38 2009 @@ -16,10 +16,10 @@ import org.junit.Before; import org.junit.Test; -public class SizeAndTimeBasedFileNamingAndTriggeringPolicyTest extends +public class SizeAndTimeBasedFNATP_Test extends ScaffoldingForRollingTests { - SizeAndTimeBasedFileNamingAndTriggeringPolicy<Object> satbfnatPolicy = new SizeAndTimeBasedFileNamingAndTriggeringPolicy<Object>(); + SizeAndTimeBasedFNATP<Object> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<Object>(); RollingFileAppender<Object> rfa1 = new RollingFileAppender<Object>(); TimeBasedRollingPolicy<Object> tbrp1 = new TimeBasedRollingPolicy<Object>(); @@ -46,8 +46,8 @@ int sizeThreshold, long givenTime, long lastCheck) { tbrp.setContext(context); - satbfnatPolicy.setMaxFileSize("" + sizeThreshold); - tbrp.setTimeBasedFileNamingAndTriggeringPolicy(satbfnatPolicy); + sizeAndTimeBasedFNATP.setMaxFileSize("" + sizeThreshold); + tbrp.setTimeBasedFileNamingAndTriggeringPolicy(sizeAndTimeBasedFNATP); tbrp.setFileNamePattern(filenamePattern); tbrp.setParent(rfa); tbrp.timeBasedTriggering.setCurrentTime(givenTime); Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java ============================================================================== --- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java (original) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java Mon Aug 3 15:23:38 2009 @@ -106,4 +106,17 @@ assertEquals("foo-2003.05.20-79.txt", fnp.convertMultipleArguments(cal.getTime(), 79)); } + @Test + public void asRegexByDate() { + Calendar cal = Calendar.getInstance(); + cal.set(2003, 4, 20, 17, 55); + + FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd}-%i.txt", context); + + String regex = fnp.asRegex(cal.getTime()); + + assertEquals("foo-2003.05.20-\\d{1,2}.txt", regex); + } + + }