From d06720838e22a7535410661c3391ab5f56219821 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Sat, 23 Feb 2019 03:43:06 +0100 Subject: [PATCH] Logback configuration is now done programmatically, fixes #832 --- .../org/cryptomator/common/Environment.java | 6 +- main/launcher/pom.xml | 4 - .../org/cryptomator/launcher/Cryptomator.java | 12 +- .../launcher/CryptomatorComponent.java | 6 +- .../org/cryptomator/logging/LoggerModule.java | 149 ++++++++++++++++++ main/launcher/src/main/resources/logback.xml | 52 ------ .../src/test/resources/logback-test.xml | 18 --- main/pom.xml | 6 - 8 files changed, 165 insertions(+), 88 deletions(-) create mode 100644 main/launcher/src/main/java/org/cryptomator/logging/LoggerModule.java delete mode 100644 main/launcher/src/main/resources/logback.xml delete mode 100644 main/launcher/src/test/resources/logback-test.xml diff --git a/main/commons/src/main/java/org/cryptomator/common/Environment.java b/main/commons/src/main/java/org/cryptomator/common/Environment.java index 16cb14aca..7f42c9d1d 100644 --- a/main/commons/src/main/java/org/cryptomator/common/Environment.java +++ b/main/commons/src/main/java/org/cryptomator/common/Environment.java @@ -47,22 +47,18 @@ public class Environment { } public Optional getLogDir() { - return getPath("cryptomator.logDir") // - .filter(Predicate.not(Path::isAbsolute)) // property must be a relative path - .map(ABSOLUTE_HOME_DIR::resolve); // resolve relative path against HOME + return getPath("cryptomator.logDir").map(this::replaceHomeDir); } public Optional getMountPointsDir() { return getPath("cryptomator.mountPointsDir").map(this::replaceHomeDir); } - private Optional getPath(String propertyName) { String value = System.getProperty(propertyName); return Optional.ofNullable(value).map(Paths::get); } - // visible for testing Stream getPaths(String propertyName) { Stream rawSettingsPaths = getRawList(propertyName, PATH_LIST_SEP); diff --git a/main/launcher/pom.xml b/main/launcher/pom.xml index 6677d1955..aef980622 100644 --- a/main/launcher/pom.xml +++ b/main/launcher/pom.xml @@ -44,9 +44,5 @@ ch.qos.logback logback-classic - - org.codehaus.janino - janino - \ No newline at end of file diff --git a/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java b/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java index 9ad0e2b73..95ef8ed3d 100644 --- a/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java +++ b/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java @@ -16,8 +16,16 @@ import java.io.IOException; public class Cryptomator { - private static final Logger LOG = LoggerFactory.getLogger(Cryptomator.class); - private static final CryptomatorComponent CRYPTOMATOR_COMPONENT = DaggerCryptomatorComponent.create(); // DaggerCryptomatorComponent gets generated by Dagger. Run Maven and include target/generated-sources/annotations in your IDE. + private static final Logger LOG; + private static final CryptomatorComponent CRYPTOMATOR_COMPONENT; + + static { + // DaggerCryptomatorComponent gets generated by Dagger. + // Run Maven and include target/generated-sources/annotations in your IDE. + CRYPTOMATOR_COMPONENT = DaggerCryptomatorComponent.create(); + CRYPTOMATOR_COMPONENT.initLogging().run(); + LOG = LoggerFactory.getLogger(Cryptomator.class); + } public static void main(String[] args) { LOG.info("Starting Cryptomator {} on {} {} ({})", CRYPTOMATOR_COMPONENT.applicationVersion().orElse("SNAPSHOT"), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH); diff --git a/main/launcher/src/main/java/org/cryptomator/launcher/CryptomatorComponent.java b/main/launcher/src/main/java/org/cryptomator/launcher/CryptomatorComponent.java index cc8acaf7d..068823744 100644 --- a/main/launcher/src/main/java/org/cryptomator/launcher/CryptomatorComponent.java +++ b/main/launcher/src/main/java/org/cryptomator/launcher/CryptomatorComponent.java @@ -4,15 +4,19 @@ import dagger.Component; import org.cryptomator.common.CommonsModule; import org.cryptomator.common.Environment; import org.cryptomator.logging.DebugMode; +import org.cryptomator.logging.LoggerModule; import javax.inject.Named; import javax.inject.Singleton; import java.util.Optional; @Singleton -@Component(modules = {CryptomatorModule.class, CommonsModule.class}) +@Component(modules = {CryptomatorModule.class, CommonsModule.class, LoggerModule.class}) public interface CryptomatorComponent { + @Named("initLogging") + Runnable initLogging(); + DebugMode debugMode(); IpcFactory ipcFactory(); diff --git a/main/launcher/src/main/java/org/cryptomator/logging/LoggerModule.java b/main/launcher/src/main/java/org/cryptomator/logging/LoggerModule.java new file mode 100644 index 000000000..429181d2e --- /dev/null +++ b/main/launcher/src/main/java/org/cryptomator/logging/LoggerModule.java @@ -0,0 +1,149 @@ +package org.cryptomator.logging; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.FileAppender; +import ch.qos.logback.core.helpers.NOPAppender; +import ch.qos.logback.core.hook.DelayingShutdownHook; +import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; +import ch.qos.logback.core.rolling.RollingFileAppender; +import ch.qos.logback.core.util.Duration; +import dagger.Module; +import dagger.Provides; +import org.cryptomator.common.Environment; +import org.slf4j.ILoggerFactory; +import org.slf4j.LoggerFactory; + +import javax.inject.Named; +import javax.inject.Singleton; +import java.nio.file.Path; + +@Module +public class LoggerModule { + + private static final String UPGRADE_FILENAME = "upgrade.log"; + private static final String LOGFILE_NAME = "cryptomator0.log"; + private static final String LOGFILE_ROLLING_PATTERN = "cryptomator%i.log"; + private static final int LOGFILE_ROLLING_MIN = 1; + private static final int LOGFILE_ROLLING_MAX = 9; + private static final double SHUTDOWN_DELAY_MS = 100; + private static final Level ROOT_LOG_LEVEL = Level.INFO; + private static final String LOG_PATTERN = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"; + + @Provides + @Singleton + LoggerContext provideLoggerContext() { + ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory(); + if (loggerFactory instanceof LoggerContext) { + return (LoggerContext) loggerFactory; + } else { + throw new IllegalStateException("SLF4J not bound to Logback."); + } + } + + @Provides + @Singleton + PatternLayoutEncoder provideLayoutEncoder(LoggerContext context) { + PatternLayoutEncoder ple = new PatternLayoutEncoder(); + ple.setPattern(LOG_PATTERN); + ple.setContext(context); + ple.start(); + return ple; + } + + @Provides + @Singleton + @Named("stdoutAppender") + Appender provideStdoutAppender(LoggerContext context, PatternLayoutEncoder encoder) { + ConsoleAppender appender = new ConsoleAppender<>(); + appender.setContext(context); + appender.setEncoder(encoder); + appender.start(); + return appender; + } + + @Provides + @Singleton + @Named("fileAppender") + Appender provideFileAppender(LoggerContext context, PatternLayoutEncoder encoder, Environment environment) { + if (environment.getLogDir().isPresent()) { + Path logDir = environment.getLogDir().get(); + RollingFileAppender appender = new RollingFileAppender<>(); + appender.setContext(context); + appender.setFile(logDir.resolve(LOGFILE_NAME).toString()); + appender.setEncoder(encoder); + LaunchBasedTriggeringPolicy triggeringPolicy = new LaunchBasedTriggeringPolicy(); + triggeringPolicy.setContext(context); + triggeringPolicy.start(); + appender.setTriggeringPolicy(triggeringPolicy); + FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy(); + rollingPolicy.setContext(context); + rollingPolicy.setFileNamePattern(logDir.resolve(LOGFILE_ROLLING_PATTERN).toString()); + rollingPolicy.setMinIndex(LOGFILE_ROLLING_MIN); + rollingPolicy.setMaxIndex(LOGFILE_ROLLING_MAX); + rollingPolicy.setParent(appender); + rollingPolicy.start(); + appender.setRollingPolicy(rollingPolicy); + appender.start(); + return appender; + } else { + NOPAppender appender = new NOPAppender<>(); + appender.setContext(context); + return appender; + } + } + + @Provides + @Singleton + @Named("upgradeAppender") + Appender provideUpgradeAppender(LoggerContext context, PatternLayoutEncoder encoder, Environment environment) { + if (environment.getLogDir().isPresent()) { + FileAppender appender = new FileAppender<>(); + appender.setFile(environment.getLogDir().get().resolve(UPGRADE_FILENAME).toString()); + appender.setContext(context); + appender.setEncoder(encoder); + appender.start(); + return appender; + } else { + NOPAppender appender = new NOPAppender<>(); + appender.setContext(context); + return appender; + } + } + + @Provides + @Singleton + @Named("initLogging") + Runnable provideLogbackInitializer(LoggerContext context, // + @Named("stdoutAppender") Appender stdout, // + @Named("upgradeAppender") Appender upgrade, // + @Named("fileAppender") Appender file) { + return () -> { + context.reset(); + + // configure root logger: + Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME); + root.setLevel(ROOT_LOG_LEVEL); + root.addAppender(stdout); + root.addAppender(file); + + // configure root logger: + Logger uprades = context.getLogger("org.cryptomator.ui.model"); + uprades.setLevel(Level.DEBUG); + uprades.addAppender(stdout); + uprades.addAppender(upgrade); + + // add shutdown hook + DelayingShutdownHook shutdownHook = new DelayingShutdownHook(); + shutdownHook.setContext(context); + shutdownHook.setDelay(Duration.buildByMilliseconds(SHUTDOWN_DELAY_MS)); + }; + } + + +} diff --git a/main/launcher/src/main/resources/logback.xml b/main/launcher/src/main/resources/logback.xml deleted file mode 100644 index 56d7eb6c7..000000000 --- a/main/launcher/src/main/resources/logback.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - ${user.home}/${cryptomator.logDir}/cryptomator0.log - - ${user.home}/${cryptomator.logDir}/cryptomator%i.log - 1 - 9 - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - ${user.home}/${cryptomator.logDir}/upgrade.log - true - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/main/launcher/src/test/resources/logback-test.xml b/main/launcher/src/test/resources/logback-test.xml deleted file mode 100644 index ebf1f5e7c..000000000 --- a/main/launcher/src/test/resources/logback-test.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - - - - diff --git a/main/pom.xml b/main/pom.xml index 98916b6b7..44efb705f 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -44,7 +44,6 @@ 1.7.25 1.2.3 - 3.0.12 5.4.0 2.24.0 @@ -162,11 +161,6 @@ logback-classic ${logback.version} - - org.codehaus.janino - janino - ${janino.version} -