(TWILL-229) Default to use logback_template.xml to configure logger, unless overridden by user

This closes #49 on Github.

Signed-off-by: Terence Yim <chtyim@apache.org>
diff --git a/twill-yarn/src/main/java/org/apache/twill/internal/ServiceMain.java b/twill-yarn/src/main/java/org/apache/twill/internal/ServiceMain.java
index 0bf07e0..b27dcd8 100644
--- a/twill-yarn/src/main/java/org/apache/twill/internal/ServiceMain.java
+++ b/twill-yarn/src/main/java/org/apache/twill/internal/ServiceMain.java
@@ -18,6 +18,8 @@
 package org.apache.twill.internal;
 
 import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.util.ContextInitializer;
+import ch.qos.logback.core.joran.spi.JoranException;
 import com.google.common.base.Throwables;
 import com.google.common.util.concurrent.AbstractIdleService;
 import com.google.common.util.concurrent.Futures;
@@ -44,9 +46,10 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+import java.net.MalformedURLException;
 import java.net.URI;
+import java.net.URL;
 import java.security.PrivilegedExceptionAction;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import javax.annotation.Nullable;
 
@@ -65,7 +68,7 @@
   }
 
   protected final void doMain(final Service mainService,
-                              Service...prerequisites) throws ExecutionException, InterruptedException {
+                              Service...prerequisites) throws Exception {
     // Only configure the log collection if it is enabled.
     if (getTwillRuntimeSpecification().isLogCollectionEnabled()) {
       configureLogger();
@@ -189,7 +192,7 @@
     );
   }
 
-  private void configureLogger() {
+  private void configureLogger() throws MalformedURLException, JoranException {
     // Check if SLF4J is bound to logback in the current environment
     ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
     if (!(loggerFactory instanceof LoggerContext)) {
@@ -198,6 +201,16 @@
 
     LoggerContext context = (LoggerContext) loggerFactory;
 
+    ContextInitializer contextInitializer = new ContextInitializer(context);
+    URL url = contextInitializer.findURLOfDefaultConfigurationFile(false);
+    if (url == null) {
+      // The logger context was not initialized using configuration file, initialize it with the logback template.
+      File twillLogback = new File(Constants.Files.RUNTIME_CONFIG_JAR, Constants.Files.LOGBACK_TEMPLATE);
+      if (twillLogback.exists()) {
+        contextInitializer.configureByResource(twillLogback.toURI().toURL());
+      }
+    }
+
     // Attach the KafkaAppender to the root logger
     KafkaAppender kafkaAppender = new KafkaAppender();
     kafkaAppender.setName("KAFKA");