Explorar el Código

Logback configuration is now done programmatically, fixes #832

Sebastian Stenzel hace 6 años
padre
commit
d06720838e

+ 1 - 5
main/commons/src/main/java/org/cryptomator/common/Environment.java

@@ -47,22 +47,18 @@ public class Environment {
 	}
 
 	public Optional<Path> 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<Path> getMountPointsDir() {
 		return getPath("cryptomator.mountPointsDir").map(this::replaceHomeDir);
 	}
 
-
 	private Optional<Path> getPath(String propertyName) {
 		String value = System.getProperty(propertyName);
 		return Optional.ofNullable(value).map(Paths::get);
 	}
 
-
 	// visible for testing
 	Stream<Path> getPaths(String propertyName) {
 		Stream<String> rawSettingsPaths = getRawList(propertyName, PATH_LIST_SEP);

+ 0 - 4
main/launcher/pom.xml

@@ -44,9 +44,5 @@
 			<groupId>ch.qos.logback</groupId>
 			<artifactId>logback-classic</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.codehaus.janino</groupId>
-			<artifactId>janino</artifactId>
-		</dependency>
 	</dependencies>
 </project>

+ 10 - 2
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);

+ 5 - 1
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();

+ 149 - 0
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<ILoggingEvent> provideStdoutAppender(LoggerContext context, PatternLayoutEncoder encoder) {
+		ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<>();
+		appender.setContext(context);
+		appender.setEncoder(encoder);
+		appender.start();
+		return appender;
+	}
+
+	@Provides
+	@Singleton
+	@Named("fileAppender")
+	Appender<ILoggingEvent> provideFileAppender(LoggerContext context, PatternLayoutEncoder encoder, Environment environment) {
+		if (environment.getLogDir().isPresent()) {
+			Path logDir = environment.getLogDir().get();
+			RollingFileAppender<ILoggingEvent> 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<ILoggingEvent> provideUpgradeAppender(LoggerContext context, PatternLayoutEncoder encoder, Environment environment) {
+		if (environment.getLogDir().isPresent()) {
+			FileAppender<ILoggingEvent> 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<ILoggingEvent> stdout, //
+										 @Named("upgradeAppender") Appender<ILoggingEvent> upgrade, //
+										 @Named("fileAppender") Appender<ILoggingEvent> 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));
+		};
+	}
+
+
+}

+ 0 - 52
main/launcher/src/main/resources/logback.xml

@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<configuration>
-
-	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-		<encoder>
-			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
-		</encoder>
-	</appender>
-
-	<if condition="isDefined(&quot;cryptomator.logDir&quot;)">
-		<then>
-		<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-			<file>${user.home}/${cryptomator.logDir}/cryptomator0.log</file>
-			<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-				<fileNamePattern>${user.home}/${cryptomator.logDir}/cryptomator%i.log</fileNamePattern>
-				<minIndex>1</minIndex>
-				<maxIndex>9</maxIndex>
-			</rollingPolicy>
-			<triggeringPolicy class="org.cryptomator.logging.LaunchBasedTriggeringPolicy" />
-			<encoder>
-				<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
-			</encoder>
-		</appender>
-
-		<appender name="UPGRADE_FILE" class="ch.qos.logback.core.FileAppender">
-			<file>${user.home}/${cryptomator.logDir}/upgrade.log</file>
-			<append>true</append>
-			<encoder>
-				<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
-			</encoder>
-		</appender>
-		</then>
-		<else>
-			<appender name="FILE" class="ch.qos.logback.core.helpers.NOPAppender"/>
-			<appender name="UPGRADE_FILE" class="ch.qos.logback.core.helpers.NOPAppender"/>
-		</else>
-	</if>
-
-	<logger name="org.cryptomator" level="INFO" />
-	<logger name="org.eclipse.jetty.server.HttpChannel" level="INFO" /> <!-- set to DEBUG to see http reqquests -->
-	<logger name="org.cryptomator.ui.model" level="INFO">
-		<appender-ref ref="UPGRADE_FILE" />
-	</logger>
-
-	<root level="INFO">
-		<appender-ref ref="STDOUT" />
-		<appender-ref ref="FILE" />
-	</root>
-
-	<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
-
-</configuration>

+ 0 - 18
main/launcher/src/test/resources/logback-test.xml

@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<configuration>
-
-	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-		<encoder>
-			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
-		</encoder>
-	</appender>
-
-	<logger name="org.cryptomator" level="DEBUG" />
-	<logger name="org.eclipse.jetty" level="INFO" />
-	<logger name="org.eclipse.jetty.server.Server" level="DEBUG" />
-	<logger name="org.apache" level="INFO" />
-
-	<root level="INFO">
-		<appender-ref ref="STDOUT" />
-	</root>
-</configuration>

+ 0 - 6
main/pom.xml

@@ -44,7 +44,6 @@
 
 		<slf4j.version>1.7.25</slf4j.version>
 		<logback.version>1.2.3</logback.version>
-		<janino.version>3.0.12</janino.version>
 
 		<junit.jupiter.version>5.4.0</junit.jupiter.version>
 		<mockito.version>2.24.0</mockito.version>
@@ -162,11 +161,6 @@
 				<artifactId>logback-classic</artifactId>
 				<version>${logback.version}</version>
 			</dependency>
-			<dependency>
-				<groupId>org.codehaus.janino</groupId>
-				<artifactId>janino</artifactId>
-				<version>${janino.version}</version>
-			</dependency>
 
 			<!-- Apache Commons -->
 			<dependency>