package org.opendaylight.yangtools.yang.validator;
import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.FileAppender;
import com.google.common.base.Stopwatch;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
* to search for yang modules.
* -r, --recursive recursive search of directories specified by -p option
* -v,--verbose shows details about the results of test running.
- *
+ * -o, --output path to output file for logs. Output file will be overwritten.
*/
public class Main {
private static final Logger LOG = LoggerFactory.getLogger(Main.class);
+ private static final ch.qos.logback.classic.Logger LOG_ROOT =
+ (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
private static final int MB = 1024 * 1024;
private static Options createOptions() {
verbose.setRequired(false);
options.addOption(verbose);
+ final Option output =
+ new Option("o", "output", true, "path to output file for logs. Output file will be overwritten");
+ output.setRequired(false);
+ options.addOption(output);
+
final Option feature = new Option(
"f",
"features",
return options;
}
- public static void main(final String[] args) {
+ public static void main(final String[] args) throws IOException {
final HelpFormatter formatter = new HelpFormatter();
final Options options = createOptions();
final CommandLine arguments = parseArguments(args, options, formatter);
return;
}
+ if (arguments.hasOption("output")) {
+ setOutput(arguments.getOptionValues("output"));
+ }
+
if (arguments.hasOption("verbose")) {
- setLoggingLevel(Level.DEBUG);
+ LOG_ROOT.setLevel(Level.DEBUG);
+
} else {
- setLoggingLevel(Level.ERROR);
+ LOG_ROOT.setLevel(Level.ERROR);
}
final List<String> yangLibDirs = initYangDirsPath(arguments);
final HashSet<QName> supportedFeatures = initSupportedFeatures(arguments);
runSystemTest(yangLibDirs, yangFiles, supportedFeatures, arguments.hasOption("recursive"));
+
+ LOG_ROOT.getLoggerContext().reset();
}
- private static void setLoggingLevel(final Level level) {
- ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(
- ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
- root.setLevel(level);
+ private static void setOutput(final String... paths) throws IOException {
+ LOG_ROOT.getLoggerContext().reset();
+
+ final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
+ encoder.setPattern("%date %level [%thread] [%file:%line] %msg%n");
+ encoder.setContext(LOG_ROOT.getLoggerContext());
+ encoder.start();
+
+ for (final String path : paths) {
+ // create FileAppender
+ final FileAppender<ILoggingEvent> logfileOut = new FileAppender<>();
+ logfileOut.setAppend(false);
+ logfileOut.setFile(path);
+ logfileOut.setContext(LOG_ROOT.getLoggerContext());
+ logfileOut.setEncoder(encoder);
+ logfileOut.start();
+
+ // attach the rolling file appender to the root logger
+ LOG_ROOT.addAppender(logfileOut);
+ }
}
@SuppressWarnings("checkstyle:illegalCatch")
}
private static void printHelp(final Options options, final HelpFormatter formatter) {
- formatter.printHelp("yang-system-test [-f features] [-h help] [-p path] [-v verbose] yangFiles...", options);
+ formatter.printHelp("yang-system-test [-f features] [-h help] [-p path] [-o output] [-v verbose] yangFiles...",
+ options);
}
private static void printMemoryInfo(final String info) {