diff --git a/pom.xml b/pom.xml index 37c967a..b87df82 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ 1.7 3.8.1 2.0 - 1.2.17 + 1.0.13 1.7.5 1.0.1 2.10.3 @@ -60,18 +60,23 @@ test - log4j - log4j - ${lib.log4j.version} + ch.qos.logback + logback-core + ${lib.logback.version} - org.slf4j - slf4j-api - ${lib.slf4j.version} + ch.qos.logback + logback-classic + ${lib.logback.version} + + + ch.qos.logback + logback-access + ${lib.logback.version} org.slf4j - slf4j-log4j12 + slf4j-api ${lib.slf4j.version} diff --git a/src/includes/log4j.properties b/src/includes/log4j.properties deleted file mode 100644 index 09e024a..0000000 --- a/src/includes/log4j.properties +++ /dev/null @@ -1,34 +0,0 @@ -log4j.rootLogger=DEBUG, C, DL, IL, EL - -# Console Output -log4j.appender.C=org.apache.log4j.ConsoleAppender -log4j.appender.C.Threshold=INFO -log4j.appender.C.layout=org.apache.log4j.EnhancedPatternLayout -log4j.appender.C.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %-5p [%c{3.}] - %m%n - -# Debug Rolling Log -log4j.appender.DL=org.apache.log4j.RollingFileAppender -log4j.appender.DL.Threshold=DEBUG -log4j.appender.DL.File=Image-Tools.debug -log4j.appender.DL.MaxFileSize=500KB -log4j.appender.DL.MaxBackupIndex=1 -log4j.appender.DL.layout=org.apache.log4j.EnhancedPatternLayout -log4j.appender.DL.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %-5p [%c{3.}] - %m%n - -# Info Rolling Log -log4j.appender.IL=org.apache.log4j.RollingFileAppender -log4j.appender.IL.Threshold=INFO -log4j.appender.IL.File=Image-Tools.info -log4j.appender.IL.MaxFileSize=100KB -log4j.appender.IL.MaxBackupIndex=1 -log4j.appender.IL.layout=org.apache.log4j.EnhancedPatternLayout -log4j.appender.IL.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %-5p [%c{3.}] - %m%n - -# Error Rolling Log -log4j.appender.EL=org.apache.log4j.RollingFileAppender -log4j.appender.EL.Threshold=ERROR -log4j.appender.EL.File=Image-Tools.err -log4j.appender.EL.MaxFileSize=100KB -log4j.appender.EL.MaxBackupIndex=1 -log4j.appender.EL.layout=org.apache.log4j.EnhancedPatternLayout -log4j.appender.EL.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %-5p [%c{3.}] - %m%n diff --git a/src/includes/logback.xml b/src/includes/logback.xml new file mode 100644 index 0000000..4a298fd --- /dev/null +++ b/src/includes/logback.xml @@ -0,0 +1,73 @@ + + + + + + false + [%-5level [%c{16}] - %message%n + + + INFO + + + + + ImageTools.debug + + false + [%date{yy-MM-dd HH:mm:ss}] %-5level [%c{16}] - %message%n + + + DEBUG + + + 1 + ImageTools.debug.%i + + + 5MB + + + + + ImageTools.info + + false + [%date{yy-MM-dd HH:mm:ss}] %-5level [%c{16}] - %message%n + + + INFO + + + 1 + ImageTools.info.%i + + + 500KB + + + + + ImageTools.err + + false + [%.16thread] [%date{yy-MM-dd HH:mm:ss}] %-5level [%c{16}] - %message%n + + + ERROR + + + 1 + ImageTools.err.%i + + + 500KB + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/sothr/imagetools/AppConfig.java b/src/main/java/com/sothr/imagetools/AppConfig.java index 84e0dd5..366250d 100644 --- a/src/main/java/com/sothr/imagetools/AppConfig.java +++ b/src/main/java/com/sothr/imagetools/AppConfig.java @@ -1,13 +1,18 @@ package com.sothr.imagetools; +import com.sothr.imagetools.util.ResourceLoader; import com.sothr.imagetools.util.PropertiesService; import com.sothr.imagetools.util.PropertiesEnum; import net.sf.ehcache.CacheManager; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.BasicConfigurator; -import org.slf4j.Logger; + import org.slf4j.LoggerFactory; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.util.StatusPrinter; + import java.io.File; import java.util.Properties; @@ -17,7 +22,7 @@ public class AppConfig { public static CacheManager cacheManager; //Logging defaults - private static final String LOGSETTINGSFILE = "./log4j.properties"; + private static final String LOGSETTINGSFILE = "./logback.xml"; private static Boolean configuredLogging = false; //Properties defaults @@ -29,78 +34,46 @@ public class AppConfig { private static Boolean configuredCache = false; public static void configureApp() { - //configSimpleLogging(); - if (!configuredLogging) { - configBasicLogging(); - loadProperties(); - resetBasicLogging(); - } else { - loadProperties(); - } + logger = (Logger)LoggerFactory.getLogger(AppConfig.class); + loadProperties(); configLogging(); configCache(); } - public static void configBasicLogging() { - BasicConfigurator.configure(); - logger = LoggerFactory.getLogger(AppConfig.class); - } - - public static void resetBasicLogging() { - logger = null; - BasicConfigurator.resetConfiguration(); - } - public static void configLogging(String location) { //Logging Config //remove previous configuration if it exists - //BasicConfigurator.resetConfiguration(); + Logger rootLogger = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + LoggerContext context = rootLogger.getLoggerContext(); + context.reset(); File file = new File(location); Boolean fromFile = false; if (file.exists()) { - fromFile = true; - PropertyConfigurator.configure(location); + fromFile = true; + try { + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(context); + // Call context.reset() to clear any previous configuration, e.g. default + // configuration. For multi-step configuration, omit calling context.reset(). + context.reset(); + configurator.doConfigure(location); + } catch (JoranException je) { + // StatusPrinter will handle this + } + StatusPrinter.printInCaseOfErrorsOrWarnings(context); } else { - //Simple error logging configuration - Properties defaultProps = new Properties(); - String rootLogger = "DEBUG"; - if (Boolean.valueOf(PropertiesService.get(PropertiesEnum.LogDebug().toString()))) { - //Rolling Debug logger - rootLogger += ", DL"; - defaultProps.setProperty("log4j.appender.DL","org.apache.log4j.RollingFileAppender"); - defaultProps.setProperty("log4j.appender.DL.Threshold","DEBUG"); - defaultProps.setProperty("log4j.appender.DL.File","Image-Tools.debug"); - defaultProps.setProperty("log4j.appender.DL.MaxFileSize","500KB"); - defaultProps.setProperty("log4j.appender.DL.MaxBackupIndex","1"); - defaultProps.setProperty("log4j.appender.DL.layout","org.apache.log4j.EnhancedPatternLayout"); - defaultProps.setProperty("log4j.appender.DL.layout.ConversionPattern","%d{yy-MM-dd HH:mm:ss} %-5p [%c{3.}] - %m%n"); - } - if (Boolean.valueOf(PropertiesService.get(PropertiesEnum.LogInfo().toString()))) { - //Rolling Info logger - rootLogger += ", IL"; - defaultProps.setProperty("log4j.appender.IL","org.apache.log4j.RollingFileAppender"); - defaultProps.setProperty("log4j.appender.IL.Threshold","INFO"); - defaultProps.setProperty("log4j.appender.IL.File","Image-Tools.info"); - defaultProps.setProperty("log4j.appender.IL.MaxFileSize","100KB"); - defaultProps.setProperty("log4j.appender.IL.MaxBackupIndex","1"); - defaultProps.setProperty("log4j.appender.IL.layout","org.apache.log4j.EnhancedPatternLayout"); - defaultProps.setProperty("log4j.appender.IL.layout.ConversionPattern","%d{yy-MM-dd HH:mm:ss} %-5p [%c{3.}] - %m%n"); - } - if (Boolean.valueOf(PropertiesService.get(PropertiesEnum.LogError().toString()))) { - //Rolling Error logger - rootLogger += ", EL"; - defaultProps.setProperty("log4j.appender.EL","org.apache.log4j.RollingFileAppender"); - defaultProps.setProperty("log4j.appender.EL.Threshold","ERROR"); - defaultProps.setProperty("log4j.appender.EL.File","Image-Tools.err"); - defaultProps.setProperty("log4j.appender.EL.MaxFileSize","100KB"); - defaultProps.setProperty("log4j.appender.EL.MaxBackupIndex","1"); - defaultProps.setProperty("log4j.appender.EL.layout","org.apache.log4j.EnhancedPatternLayout"); - defaultProps.setProperty("log4j.appender.EL.layout.ConversionPattern","%d{yy-MM-dd HH:mm:ss} %-5p [%c{3.}] - %m%n"); - } - defaultProps.setProperty("log4j.rootLogger",rootLogger); - PropertyConfigurator.configure(defaultProps); + try { + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(context); + // Call context.reset() to clear any previous configuration, e.g. default + // configuration. For multi-step configuration, omit calling context.reset(). + context.reset(); + configurator.doConfigure(ResourceLoader.get().getResource("logback-minimum-config.xml")); + } catch (JoranException je) { + // StatusPrinter will handle this + } + StatusPrinter.printInCaseOfErrorsOrWarnings(context); } - logger = LoggerFactory.getLogger(AppConfig.class); String message = fromFile ? "From File" : "From Defaults"; logger.info(String.format("Configured Logger %s", message)); logger.info("Detected Version: %s of Image Tools".format(PropertiesService.getVersion().toString())); diff --git a/src/main/resources/logback-minimum-config.xml b/src/main/resources/logback-minimum-config.xml new file mode 100644 index 0000000..ab0887d --- /dev/null +++ b/src/main/resources/logback-minimum-config.xml @@ -0,0 +1,23 @@ + + + + ImageTools.err + + false + [%date{HH:mm:ss}] %-5level [%c{16}] - %message%n + + + ERROR + + + 5 + ImageTools.err.%i + + + 500KB + + + + + + \ No newline at end of file diff --git a/src/main/scala/com/sothr/imagetools/image/ImageService.scala b/src/main/scala/com/sothr/imagetools/image/ImageService.scala index a574360..b7f6d8a 100644 --- a/src/main/scala/com/sothr/imagetools/image/ImageService.scala +++ b/src/main/scala/com/sothr/imagetools/image/ImageService.scala @@ -14,11 +14,27 @@ object ImageService extends Logging { val imageCache = AppConfig.cacheManager.getCache("images") + private def lookupImage(file:File):Image = { + var image:Image = null + //get from memory cache if possible + if (imageCache.isKeyInCache(file.getAbsolutePath)) image = imageCache.get(file.getAbsolutePath).getObjectValue.asInstanceOf[Image] + //get from datastore if possible + image + } + + private def saveImage(image:Image):Image = { + //save to cache + imageCache.put(new Element(image.imagePath, image)) + //save to datastore + image + } + def getImage(file:File):Image = { try { - if (imageCache.isKeyInCache(file.getAbsolutePath)) { + val image = lookupImage(file) + if (image != null) { debug(s"${file.getAbsolutePath} was already processed") - return imageCache.get(file.getAbsolutePath).getObjectValue.asInstanceOf[Image] + return image } else { val bufferedImage = ImageIO.read(file) val thumbnailPath = getThumbnailPath(bufferedImage, file) @@ -26,8 +42,7 @@ object ImageService extends Logging { val imageSize = { (bufferedImage.getWidth, bufferedImage.getHeight) } val image = new Image(file.getAbsolutePath, thumbnailPath, imageSize, hashes) debug(s"Created image: $image") - imageCache.put(new Element(file.getAbsolutePath, image)) - return image + return saveImage(image) } } catch { case ioe:IOException => error(s"Error processing ${file.getAbsolutePath}", ioe) diff --git a/src/test/resources/logback-minimum-config.xml b/src/test/resources/logback-minimum-config.xml new file mode 100644 index 0000000..d4622c7 --- /dev/null +++ b/src/test/resources/logback-minimum-config.xml @@ -0,0 +1,59 @@ + + + + ImageTools.debug + + false + [%date{yy-MM-dd HH:mm:ss}] %-5level [%c{16}] - %message%n + + + DEBUG + + + 1 + ImageTools.debug.%i + + + 5MB + + + + ImageTools.info + + false + [%date{yy-MM-dd HH:mm:ss}] %-5level [%c{16}] - %message%n + + + INFO + + + 1 + ImageTools.info.%i + + + 500KB + + + + ImageTools.err + + false + [%.16thread] [%date{yy-MM-dd HH:mm:ss}] %-5level [%c{16}] - %message%n + + + ERROR + + + 1 + ImageTools.err.%i + + + 500KB + + + + + + + + \ No newline at end of file