Add option to setup output file for logs in validator 27/63327/12
authorJakub Toth <jakub.toth@pantheon.tech>
Wed, 20 Sep 2017 11:58:33 +0000 (13:58 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 3 Oct 2017 08:28:27 +0000 (08:28 +0000)
  * added option -o (--output) to setup path of output file
    for logs

Change-Id: I42ba358932c4cf20fa11400490c1d11e2a0f6046
Signed-off-by: Jakub Toth <jakub.toth@pantheon.tech>
yang/yang-model-validator/src/main/java/org/opendaylight/yangtools/yang/validator/Main.java

index 881c432aff3a5dc945c13c3acc982d87951c7ad3..47cb7faca49ce7fda1c0ee3ddad50dc13bec4630 100644 (file)
@@ -8,7 +8,11 @@
 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;
@@ -41,10 +45,12 @@ import org.slf4j.LoggerFactory;
  *                        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() {
@@ -68,6 +74,11 @@ public class Main {
         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",
@@ -80,7 +91,7 @@ public class Main {
         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);
@@ -90,10 +101,15 @@ public class Main {
             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);
@@ -101,12 +117,30 @@ public class Main {
         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")
@@ -184,7 +218,8 @@ public class Main {
     }
 
     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) {