svn commit: r2183 - in logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic: corpus spi

Author: ceki Date: Fri Mar 6 14:52:38 2009 New Revision: 2183 Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java - copied, changed from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java Removed: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java Log: Still working on the Corpus Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java Fri Mar 6 14:52:38 2009 @@ -0,0 +1,42 @@ +package ch.qos.logback.classic.corpus; + +import java.io.IOException; +import java.util.List; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.classic.spi.LoggerContextVO; +import ch.qos.logback.classic.spi.PubLoggingEventVO; + +public class Corpus { + + static final int STANDARD_CORPUS_SIZE = 50 * 1000; + static final int STANDARD_SEED = 1123; + + static public ILoggingEvent[] make(CorpusMaker corpusMaker, int n) { + LoggerContextVO lcVO = corpusMaker.getRandomlyNamedLoggerContextVO(); + PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n]; + for (int i = 0; i < n; i++) { + PubLoggingEventVO e = new PubLoggingEventVO(); + plevoArray[i] = e; + e.loggerContextVO = lcVO; + e.timeStamp = corpusMaker.getRandomTimeStamp(); + + LogStatement logStatement = corpusMaker.getRandomLogStatementFromPool(); + e.loggerName = logStatement.loggerName; + e.level = logStatement.level; + e.message = logStatement.messagerItem.message; + e.argumentArray = corpusMaker.getRandomArgumentArray(logStatement.messagerItem.numberOfArguments); + e.throwableProxy = logStatement.throwableProxy; + e.threadName = corpusMaker.getRandomThreadNameFromPool(); + } + return plevoArray; + } + + static public ILoggingEvent[] makeStandardCorpus() throws IOException { + List<String> worldList = TextFileUtil + .toWords("src/test/input/corpus/origin_of_species.txt"); + CorpusMaker corpusMaker = new CorpusMaker(STANDARD_SEED, worldList); + return make(corpusMaker, STANDARD_CORPUS_SIZE); + } + +} Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java Fri Mar 6 14:52:38 2009 @@ -9,32 +9,27 @@ */ package ch.qos.logback.classic.corpus; -import java.io.IOException; import java.util.List; import java.util.Random; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ClassPackagingData; -import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggerContextVO; -import ch.qos.logback.classic.spi.PubLoggingEventVO; import ch.qos.logback.classic.spi.StackTraceElementProxy; import ch.qos.logback.classic.spi.ThrowableProxy; import ch.qos.logback.classic.spi.ThrowableProxyVO; public class CorpusMaker { - static final int STANDARD_CORPUS_SIZE = 100*1000; - // level distribution is determined by the following table // it corresponds to TRACE 20%, DEBUG 30%, INFO 30%, WARN 10%, // ERROR 10%. See also getRandomLevel() method. static final double[] LEVEL_DISTRIBUTION = new double[] { .2, .5, .8, .9 }; - // messages will have no arguments 90% of the time, one argument in 3%, two - // arguments in 3% and three arguments in 3% of cases - static final double[] ARGUMENT_DISTRIBUTION = new double[] { .90, .933, 0.966 }; + // messages will have no arguments 80% of the time, one argument in 8%, two + // arguments in 7% and three arguments in 5% of cases + static final double[] ARGUMENT_DISTRIBUTION = new double[] { .80, .88, 0.95 }; static final double THROWABLE_PROPABILITY_FOR_WARNING = .1; static final double THROWABLE_PROPABILITY_FOR_ERRORS = .3; @@ -46,86 +41,95 @@ static final int AVERAGE_MESSAGE_WORDS = 8; static final int STD_DEV_FOR_MESSAGE_WORDS = 4; + static final int AVERAGE_MILLIS_INCREMENT = 10; + static final int STD_DEV_FOR_MILLIS_INCREMENT = 5; + static final int THREAD_POOL_SIZE = 10; + static final int LOGGER_POOL_SIZE = 1000; + static final int LOG_STATEMENT_POOL_SIZE = LOGGER_POOL_SIZE * 8; final Random random; List<String> worldList; String[] threadNamePool; + LogStatement[] logStatementPool; + + // 2009-03-06 13:08 GMT + long lastTimeStamp = 1236344888578L; + public CorpusMaker(long seed, List<String> worldList) { random = new Random(seed); this.worldList = worldList; buildThreadNamePool(); + buildLogStatementPool(); } - void buildThreadNamePool() { + private void buildThreadNamePool() { threadNamePool = new String[THREAD_POOL_SIZE]; for (int i = 0; i < THREAD_POOL_SIZE; i++) { threadNamePool[i] = "CorpusMakerThread-" + i; } } - static public ILoggingEvent[] makeStandardCorpus() throws IOException { - List<String> worldList = TextFileUtil - .toWords("src/test/input/corpus/origin_of_species.txt"); - CorpusMaker corpusMaker = new CorpusMaker(10, worldList); - return corpusMaker.make(STANDARD_CORPUS_SIZE); + private void buildLogStatementPool() { + String[] loggerNamePool = new String[LOGGER_POOL_SIZE]; + for (int i = 0; i < LOGGER_POOL_SIZE; i++) { + loggerNamePool[i] = makeRandomLoggerName(); + } + logStatementPool = new LogStatement[LOG_STATEMENT_POOL_SIZE]; + for (int i = 0; i < LOG_STATEMENT_POOL_SIZE; i++) { + logStatementPool[i] = makeRandomLogStatement(loggerNamePool); + } } - public ILoggingEvent[] make(int n) { - - LoggerContextVO lcVO = getRandomlyNamedLoggerContextVO(); + private int[] getRandomAnchorPositions(int wordCount, int numAnchors) { + // note that the same position may appear multiple times in + // positionsIndex, but without serious consequences + int[] positionsIndex = new int[numAnchors]; + for (int i = 0; i < numAnchors; i++) { + positionsIndex[i] = random.nextInt(wordCount); + } + return positionsIndex; + } - PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n]; + private String[] getRandomWords(int n) { + String[] wordArray = new String[n]; for (int i = 0; i < n; i++) { - PubLoggingEventVO e = new PubLoggingEventVO(); - plevoArray[i] = e; - e.timeStamp = getRandomLong(); - e.loggerName = getRandomLoggerName(); - e.level = getRandomLevel(); - MessageEntry me = getRandomMessageEntry(); - e.message = me.message; - e.argumentArray = me.argumentArray; - e.loggerContextVO = lcVO; - Throwable t = getRandomThrowable(e.level); - if (t != null) { - e.throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t)); - pupulateWithPackagingData(e.throwableProxy - .getStackTraceElementProxyArray()); - } - e.threadName = getRandomThreadName(); + wordArray[i] = getRandomWord(); } - return plevoArray; + return wordArray; } - void pupulateWithPackagingData(StackTraceElementProxy[] stepArray) { - int i = 0; - for (StackTraceElementProxy step : stepArray) { - String identifier = "na"; - String version = "na"; - if (i++ % 2 == 0) { - identifier = getRandomJavaIdentifier(); - version = getRandomJavaIdentifier(); - } - ClassPackagingData cpd = new ClassPackagingData(identifier, version); - step.setClassPackagingData(cpd); - } + public long getRandomLong() { + return random.nextLong(); + } + public String getRandomThreadNameFromPool() { + int index = random.nextInt(THREAD_POOL_SIZE); + return threadNamePool[index]; } - LoggerContextVO getRandomlyNamedLoggerContextVO() { - LoggerContext lc = new LoggerContext(); - lc.setName(getRandomJavaIdentifier()); - return new LoggerContextVO(lc); + public LogStatement getRandomLogStatementFromPool() { + int index = random.nextInt(logStatementPool.length); + return logStatementPool[index]; } - long getRandomLong() { - return random.nextLong(); + private String getRandomLoggerNameFromPool(String[] loggerNamePool) { + int index = random.nextInt(loggerNamePool.length); + return loggerNamePool[index]; } - String getRandomThreadName() { - int index = random.nextInt(THREAD_POOL_SIZE); - return threadNamePool[index]; + public long getRandomTimeStamp() { + // subtract 1 so that 0 is allowed + lastTimeStamp += RandomUtil.gaussianAsPositiveInt(random, + AVERAGE_MILLIS_INCREMENT, STD_DEV_FOR_MILLIS_INCREMENT) - 1; + return lastTimeStamp; + } + + LoggerContextVO getRandomlyNamedLoggerContextVO() { + LoggerContext lc = new LoggerContext(); + lc.setName(getRandomJavaIdentifier()); + return new LoggerContextVO(lc); } String getRandomWord() { @@ -134,56 +138,54 @@ return worldList.get(randomIndex); } - int[] getRandomAnchorPositions(int wordCount, int numAnchors) { - // note that the same position may appear multiple times in - // positionsIndex, but without serious consequences - int[] positionsIndex = new int[numAnchors]; - for (int i = 0; i < numAnchors; i++) { - positionsIndex[i] = random.nextInt(wordCount); + public Object[] getRandomArgumentArray(int numOfArguments) { + if (numOfArguments == 0) { + return null; } - return positionsIndex; - } - - private String[] getRandomWords(int n) { - String[] wordArray = new String[n]; - for (int i = 0; i < n; i++) { - wordArray[i] = getRandomWord(); + Object[] argumentArray = new Object[numOfArguments]; + for (int i = 0; i < numOfArguments; i++) { + argumentArray[i] = new Long(random.nextLong()); } - return wordArray; + return argumentArray; } - MessageEntry getRandomMessageEntry() { + private MessageItem makeRandomMessageEntry() { int numOfArguments = getNumberOfMessageArguments(); - Object[] argumentArray = null; - if (numOfArguments > 0) { - argumentArray = new Object[numOfArguments]; - for (int i = 0; i < numOfArguments; i++) { - argumentArray[i] = new Long(random.nextLong()); - } - } + int wordCount = RandomUtil.gaussianAsPositiveInt(random, AVERAGE_MESSAGE_WORDS, STD_DEV_FOR_MESSAGE_WORDS); String[] wordArray = getRandomWords(wordCount); int[] anchorPositions = getRandomAnchorPositions(wordCount, numOfArguments); + for (int anchorIndex : anchorPositions) { wordArray[anchorIndex] = "{}"; } StringBuilder sb = new StringBuilder(); for (int i = 1; i < wordCount; i++) { - sb.append(getRandomWord()).append(' '); + sb.append(wordArray[i]).append(' '); } sb.append(getRandomWord()); - - return new MessageEntry(sb.toString(), argumentArray); + return new MessageItem(sb.toString(), numOfArguments); } - Throwable buildThrowable(double i) { - return null; + private LogStatement makeRandomLogStatement(String[] loggerNamePool) { + MessageItem mi = makeRandomMessageEntry(); + String loggerName = getRandomLoggerNameFromPool(loggerNamePool); + Level randomLevel = getRandomLevel(); + Throwable t = getRandomThrowable(randomLevel); + ThrowableProxyVO throwableProxy = null; + if (t != null) { + throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t)); + pupulateWithPackagingData(throwableProxy.getStackTraceElementProxyArray()); + } + LogStatement logStatement = new LogStatement(loggerName, randomLevel, mi, + throwableProxy); + return logStatement; } - Throwable getRandomThrowable(Level level) { + private Throwable getRandomThrowable(Level level) { double rn = random.nextDouble(); if ((level == Level.WARN && rn < THROWABLE_PROPABILITY_FOR_WARNING) || (level == Level.ERROR && rn < THROWABLE_PROPABILITY_FOR_ERRORS)) { @@ -193,7 +195,21 @@ } } - int getNumberOfMessageArguments() { + private void pupulateWithPackagingData(StackTraceElementProxy[] stepArray) { + int i = 0; + for (StackTraceElementProxy step : stepArray) { + String identifier = "na"; + String version = "na"; + if (i++ % 2 == 0) { + identifier = getRandomJavaIdentifier(); + version = getRandomJavaIdentifier(); + } + ClassPackagingData cpd = new ClassPackagingData(identifier, version); + step.setClassPackagingData(cpd); + } + } + + private int getNumberOfMessageArguments() { double rn = random.nextDouble(); if (rn < ARGUMENT_DISTRIBUTION[0]) { return 0; @@ -213,7 +229,7 @@ return w; } - String getRandomLoggerName() { + private String makeRandomLoggerName() { int parts = RandomUtil.gaussianAsPositiveInt(random, AVERAGE_LOGGER_NAME_PARTS, STD_DEV_FOR_LOGGER_NAME_PARTS); StringBuilder sb = new StringBuilder(); @@ -224,7 +240,7 @@ return sb.toString(); } - Level getRandomLevel() { + private Level getRandomLevel() { double rn = random.nextDouble(); if (rn < LEVEL_DISTRIBUTION[0]) { return Level.TRACE; Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java Fri Mar 6 14:52:38 2009 @@ -0,0 +1,29 @@ +package ch.qos.logback.classic.corpus; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.spi.IThrowableProxy; + +public class LogStatement { + + final String loggerName; + final MessageItem messagerItem; + final Level level; + final IThrowableProxy throwableProxy; + + public LogStatement(String loggerName, Level level, MessageItem messagerItem, + IThrowableProxy tp) { + this.loggerName = loggerName; + this.level = level; + this.messagerItem = messagerItem; + this.throwableProxy = tp; + } + + public String getLoggerName() { + return loggerName; + } + + public MessageItem getMessagerItem() { + return messagerItem; + } + +} Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java (from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageEntry.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageItem.java Fri Mar 6 14:52:38 2009 @@ -1,27 +1,18 @@ package ch.qos.logback.classic.corpus; -public class MessageEntry { +public class MessageItem { final String message; - final Object[] argumentArray; + final int numberOfArguments; - public MessageEntry(String message) { - this(message, null); + MessageItem(String message) { + this(message, 0); } - - public MessageEntry(String message, Object[] argumentArray) { + public MessageItem(String message, int numberOfArguments) { this.message = message; - this.argumentArray = argumentArray; - } - - public String getMessage() { - return message; + this.numberOfArguments = numberOfArguments; } - public Object[] getArgumentArray() { - return argumentArray; - } - } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java Fri Mar 6 14:52:38 2009 @@ -36,7 +36,7 @@ public Object[] argumentArray; - public ThrowableProxyVO throwableProxy; + public IThrowableProxy throwableProxy; public CallerData[] callerDataArray; public Marker marker; public Map<String, String> mdcPropertyMap;
participants (1)
-
noreply.ceki@qos.ch