Prechádzať zdrojové kódy

internalized logback config, added -Dcryptomator.logDir=path/relative/to/home. external logback configuration can still be used via -Dlogback.configurationFile=/path/to/logback.xml

Sebastian Stenzel 6 rokov pred
rodič
commit
b9a120b51b

+ 15 - 0
main/commons/src/main/java/org/cryptomator/common/Environment.java

@@ -9,6 +9,7 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Optional;
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.Predicate;
@@ -29,6 +30,7 @@ public class Environment {
 		LOG.debug("cryptomator.settingsPath: {}", System.getProperty("cryptomator.settingsPath"));
 		LOG.debug("cryptomator.ipcPortPath: {}", System.getProperty("cryptomator.ipcPortPath"));
 		LOG.debug("cryptomator.keychainPath: {}", System.getProperty("cryptomator.keychainPath"));
+		LOG.debug("cryptomator.logDir: {}", System.getProperty("cryptomator.logDir"));
 	}
 
 	public Stream<Path> getSettingsPath() {
@@ -43,6 +45,19 @@ public class Environment {
 		return getPaths("cryptomator.keychainPath");
 	}
 
+	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
+	}
+
+
+	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);

+ 23 - 0
main/commons/src/test/java/org/cryptomator/common/EnvironmentTest.java

@@ -2,6 +2,7 @@ package org.cryptomator.common;
 
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -11,6 +12,7 @@ import org.junit.jupiter.api.Test;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 @DisplayName("Environment Variables Test")
@@ -60,6 +62,27 @@ class EnvironmentTest {
 		MatcherAssert.assertThat(result, Matchers.contains(Paths.get("/home/testuser/AppData/Roaming/Cryptomator/keychain.json")));
 	}
 
+	@Test
+	@DisplayName("cryptomator.logDir=/foo/bar")
+	public void testAbsoluteLogDir() {
+		System.setProperty("cryptomator.logDir", "/foo/bar");
+
+		Optional<Path> logDir = env.getLogDir();
+
+		Assertions.assertFalse(logDir.isPresent());
+	}
+
+	@Test
+	@DisplayName("cryptomator.logDir=foo/bar")
+	public void testRelativeLogDir() {
+		System.setProperty("cryptomator.logDir", "foo/bar");
+
+		Optional<Path> logDir = env.getLogDir();
+
+		Assertions.assertTrue(logDir.isPresent());
+		Assertions.assertEquals(Paths.get("/home/testuser/foo/bar"), logDir.get());
+	}
+
 	@Nested
 	@DisplayName("Path Lists")
 	class SettingsPath {

+ 4 - 0
main/launcher/pom.xml

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

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

@@ -0,0 +1,52 @@
+<?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}/Library/Logs/Cryptomator/cryptomator.log</file>
+			<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+				<fileNamePattern>${user.home}/${cryptomator.logDir}/cryptomator%i.log</fileNamePattern>
+				<minIndex>0</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 - 2
main/launcher/src/test/resources/logback-test.xml

@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE xml>
-<!-- log config used during unit tests and starts from IDE. For production please specify -Dlogback.configurationFile=/path/to/config -->
 <configuration>
 
 	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

+ 6 - 0
main/pom.xml

@@ -44,6 +44,7 @@
 
 		<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>
@@ -161,6 +162,11 @@
 				<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>