APEXCORE-792 LoggerUtil should allow to get LogFileInformation for a specified logger
diff --git a/engine/src/main/java/com/datatorrent/stram/util/LoggerUtil.java b/engine/src/main/java/com/datatorrent/stram/util/LoggerUtil.java
index c6caa20..30a9275 100644
--- a/engine/src/main/java/com/datatorrent/stram/util/LoggerUtil.java
+++ b/engine/src/main/java/com/datatorrent/stram/util/LoggerUtil.java
@@ -313,8 +313,21 @@
    */
   public static LogFileInformation getLogFileInformation()
   {
-    FileAppender fileAppender = getFileAppender();
-    if (shouldFetchLogFileInformation(fileAppender)) {
+    return getLogFileInformation(LogManager.getRootLogger());
+  }
+
+  public static LogFileInformation getLogFileInformation(org.slf4j.Logger logger)
+  {
+    return getLogFileInformation(logger == null ? null : LogManager.getLogger(logger.getName()));
+  }
+
+  public static LogFileInformation getLogFileInformation(Logger logger)
+  {
+    if (logger == null) {
+      logger = LogManager.getRootLogger();
+    }
+    FileAppender fileAppender = getFileAppender(logger);
+    if (fileAppender != null) {
       File logFile = new File(fileAppender.getFile());
       LogFileInformation logFileInfo = new LogFileInformation(fileAppender.getFile(), logFile.length());
       return logFileInfo;
@@ -322,37 +335,33 @@
     return null;
   }
 
-  private static FileAppender getFileAppender()
+  private static FileAppender getFileAppender(Logger logger)
   {
-    Enumeration<Appender> e = LogManager.getRootLogger().getAllAppenders();
+    Enumeration e = logger.getAllAppenders();
     FileAppender fileAppender = null;
     while (e.hasMoreElements()) {
-      Appender appender = e.nextElement();
+      Object appender = e.nextElement();
       if (appender instanceof FileAppender) {
         if (fileAppender == null) {
           fileAppender = (FileAppender)appender;
         } else {
           //skip fetching log file information if we have multiple file Appenders
-          return null;
+          fileAppender = null;
+          break;
         }
       }
     }
-    return fileAppender;
-  }
-
-  /*
-   * We should return log file information only if,
-   * we have single file Appender, the logging level of appender is set to level Error or above and immediateFlush is set to true.
-   * In future we should be able to enhance this feature to support multiple file appenders.
-   */
-  private static boolean shouldFetchLogFileInformation(FileAppender fileAppender)
-  {
-    if (fileAppender != null && isErrorLevelEnable(fileAppender) && fileAppender.getImmediateFlush()) {
-      return true;
+    /*
+     * We should return log file information only if,
+     * we have single file Appender, the logging level of appender is set to level Error or above and immediateFlush is set to true.
+     * In future we should be able to enhance this feature to support multiple file appenders.
+     */
+    if (fileAppender == null || !fileAppender.getImmediateFlush() || !fileAppender.isAsSevereAsThreshold(Level.ERROR)) {
+      LoggerUtil.logger.warn(
+          "Log information is unavailable. To enable log information log4j/logging should be configured with single FileAppender that has immediateFlush set to true and log level set to ERROR or greater.");
+      return null;
     }
-    logger.warn(
-        "Log information is unavailable. To enable log information log4j/logging should be configured with single FileAppender that has immediateFlush set to true and log level set to ERROR or greater.");
-    return false;
+    return fileAppender;
   }
 
   private static boolean isErrorLevelEnable(FileAppender fileAppender)
diff --git a/engine/src/test/java/com/datatorrent/stram/util/LogFileInformationTest.java b/engine/src/test/java/com/datatorrent/stram/util/LogFileInformationTest.java
index 32c56c4..61e994e 100644
--- a/engine/src/test/java/com/datatorrent/stram/util/LogFileInformationTest.java
+++ b/engine/src/test/java/com/datatorrent/stram/util/LogFileInformationTest.java
@@ -22,25 +22,25 @@
 import java.io.IOException;
 
 import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.LoggerFactory;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.RollingFileAppender;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 public class LogFileInformationTest
 {
   private static final String APPENDER_NAME = "rfa";
-  private static final org.slf4j.Logger logger = LoggerFactory.getLogger(LogFileInformationTest.class);
+  private static final Logger logger = LogManager.getLogger(LogFileInformationTest.class);
   private static String logFileName;
 
   @BeforeClass
@@ -51,61 +51,56 @@
     RollingFileAppender rfa = new RollingFileAppender(new PatternLayout("%d{ISO8601} [%t] %-5p %c{2} %M - %m%n"),
         logFileName);
     rfa.setName(APPENDER_NAME);
-    Logger.getRootLogger().addAppender(rfa);
-  }
-
-  @Before
-  public void setup()
-  {
-    LoggerUtil.initializeLogger();
+    logger.addAppender(rfa);
   }
 
   @Test
   public void testGetLogFileInformation()
   {
-    long currentLogFileSize = LoggerUtil.getLogFileInformation().fileOffset;
+    long currentLogFileSize = LoggerUtil.getLogFileInformation(logger).fileOffset;
     logger.info("Adding Test log message.");
-    assertEquals(logFileName, LoggerUtil.getLogFileInformation().fileName);
-    assertTrue(LoggerUtil.getLogFileInformation().fileOffset > currentLogFileSize);
+    assertEquals(logFileName, LoggerUtil.getLogFileInformation(logger).fileName);
+    assertTrue(LoggerUtil.getLogFileInformation(logger).fileOffset > currentLogFileSize);
   }
 
   @Test
   public void testImmediateFlushOff()
   {
-    RollingFileAppender rfa = (RollingFileAppender)Logger.getRootLogger().getAppender(APPENDER_NAME);
+    RollingFileAppender rfa = (RollingFileAppender)logger.getAppender(APPENDER_NAME);
+    assertTrue(rfa.getImmediateFlush());
     rfa.setImmediateFlush(false);
-    Logger.getRootLogger().addAppender(rfa);
-    LoggerUtil.initializeLogger();
-
-    Assert.assertNull(LoggerUtil.getLogFileInformation());
+    assertNull(LoggerUtil.getLogFileInformation());
     rfa.setImmediateFlush(true);
   }
 
   @Test
   public void testErrorLevelOff()
   {
-    Level curLogLevel = Logger.getRootLogger().getLevel();
-    Logger.getRootLogger().setLevel(Level.FATAL);
-    LoggerUtil.initializeLogger();
-
-    Assert.assertNull(LoggerUtil.getLogFileInformation());
-    Logger.getRootLogger().setLevel(curLogLevel);
+    RollingFileAppender rfa = (RollingFileAppender)logger.getAppender(APPENDER_NAME);
+    assertNull(rfa.getThreshold());
+    rfa.setThreshold(Level.FATAL);
+    assertNull(LoggerUtil.getLogFileInformation(logger));
+    rfa.setThreshold(null);
   }
 
   @Test
   public void testNoFileAppender()
   {
-    RollingFileAppender rfa = (RollingFileAppender)Logger.getRootLogger().getAppender(APPENDER_NAME);
-    Logger.getRootLogger().removeAppender(APPENDER_NAME);
-    LoggerUtil.initializeLogger();
-    Assert.assertNull(LoggerUtil.getLogFileInformation());
-    Logger.getRootLogger().addAppender(rfa);
+    RollingFileAppender rfa = (RollingFileAppender)logger.getAppender(APPENDER_NAME);
+    logger.removeAppender(APPENDER_NAME);
+    assertNull(LoggerUtil.getLogFileInformation());
+    logger.addAppender(rfa);
+  }
+
+  @Test
+  public void testSlf4Logger()
+  {
+    assertNotNull(LoggerUtil.getLogFileInformation(LoggerFactory.getLogger(LogFileInformationTest.class)));
   }
 
   @AfterClass
   public static void tearDown()
   {
-    Logger.getRootLogger().removeAppender(APPENDER_NAME);
-    FileUtils.deleteQuietly(new File(logFileName).getParentFile());
+    LogManager.getLogger(LogFileInformationTest.class).removeAppender(APPENDER_NAME);
   }
 }