/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2015, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.classic.corpus; import java.io.FileWriter; import java.io.IOException; import java.net.URL; import java.util.List; import ch.qos.logback.classic.ClassicConstants; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.IThrowableProxy; import ch.qos.logback.classic.spi.LoggerContextVO; import ch.qos.logback.classic.spi.PubLoggingEventVO; import ch.qos.logback.classic.spi.ThrowableProxyUtil; import ch.qos.logback.core.CoreConstants; /** * * <p>Usage: * * <p><code>ILoggingEvent[] eventArray = Corpus.makeStandardCorpus();</code> * * <p>if you wish to dump the events into a file, say "/corpus.log" : * * <p> <code>Corpus.dump(eventArray, "/corpus.log"); * * <p>For the model behind the corpus, refer to {@link CorpusModel}. * * @author Ceki Gülcü * */ public class Corpus { static public final int STANDARD_CORPUS_SIZE = 50 * 1000; private static final int STANDARD_SEED = 34780; static public List<String> getStandatdCorpusWordList() throws IOException { ClassLoader classLoader = Corpus.class.getClassLoader(); URL originOfSpeciesURL = classLoader.getResource("corpus/origin_of_species.txt"); return TextFileUtil.toWords(originOfSpeciesURL); } /** * Make a standard corpus. The standard corpus has * {@link #STANDARD_CORPUS_SIZE} elements. * * @return event array representing the standard corpus * @throws IOException */ static public ILoggingEvent[] makeStandardCorpus() throws IOException { List<String> worldList = getStandatdCorpusWordList(); CorpusModel corpusMaker = new CorpusModel(STANDARD_SEED, worldList); return make(corpusMaker, STANDARD_CORPUS_SIZE, true); } static public ILoggingEvent[] make(CorpusModel corpusModel, int n, boolean withCallerData) { LoggerContextVO lcVO = corpusModel.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 = corpusModel.getRandomTimeStamp(); LogStatement logStatement = corpusModel.getRandomLogStatementFromPool(); e.loggerName = logStatement.loggerName; e.level = logStatement.level; e.message = logStatement.mat.message; e.argumentArray = corpusModel.getRandomArgumentArray(logStatement.mat.numberOfArguments); if (withCallerData) { e.callerDataArray = corpusModel.getRandomCallerData(ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH, e.loggerName); } e.throwableProxy = logStatement.throwableProxy; e.threadName = corpusModel.getRandomThreadNameFromPool(); } return plevoArray; } /** * Dump the events passed as argument into the file named targetFile. * * @param eventArray * @param targetFile * @throws IOException */ public static void dump(ILoggingEvent[] eventArray, String targetFile) throws IOException { FileWriter fw = new FileWriter(targetFile); for (ILoggingEvent e : eventArray) { fw.write(e.toString()); fw.append(CoreConstants.LINE_SEPARATOR); if (e.getThrowableProxy() != null) { IThrowableProxy tp = e.getThrowableProxy(); fw.write(ThrowableProxyUtil.asString(tp)); } } fw.flush(); fw.close(); } }