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);
}
}