diff --git a/extensions/guacamole-auth-mysql/pom.xml b/extensions/guacamole-auth-mysql/pom.xml
index f769bcb83..577a57df8 100644
--- a/extensions/guacamole-auth-mysql/pom.xml
+++ b/extensions/guacamole-auth-mysql/pom.xml
@@ -97,13 +97,7 @@
org.slf4j
slf4j-api
- 1.6.1
-
-
- org.slf4j
- slf4j-jcl
- 1.6.1
- runtime
+ 1.7.7
diff --git a/guacamole-common/pom.xml b/guacamole-common/pom.xml
index f6db00750..36068d334 100644
--- a/guacamole-common/pom.xml
+++ b/guacamole-common/pom.xml
@@ -116,7 +116,7 @@
org.slf4j
slf4j-api
- 1.6.1
+ 1.7.7
diff --git a/guacamole/pom.xml b/guacamole/pom.xml
index 3c50570a1..33fe0fd6b 100644
--- a/guacamole/pom.xml
+++ b/guacamole/pom.xml
@@ -106,17 +106,16 @@
provided
-
+
org.slf4j
slf4j-api
- 1.6.1
+ 1.7.7
- org.slf4j
- slf4j-jcl
- 1.6.1
- runtime
+ ch.qos.logback
+ logback-classic
+ 1.1.2
diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/log/LogbackInitializer.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/log/LogbackInitializer.java
new file mode 100644
index 000000000..712395608
--- /dev/null
+++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/log/LogbackInitializer.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2014 Glyptodon LLC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package org.glyptodon.guacamole.net.basic.log;
+
+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 javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import org.glyptodon.guacamole.properties.GuacamoleHome;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Initializes the logback logging subsystem, used behind SLF4J within
+ * Guacamole for all logging.
+ *
+ * @author Michael Jumper
+ */
+public class LogbackInitializer implements ServletContextListener {
+
+ /**
+ * Logger for this class.
+ */
+ private final Logger logger = LoggerFactory.getLogger(LogbackInitializer.class);
+
+ @Override
+ public void contextDestroyed(ServletContextEvent sce) {
+ }
+
+ @Override
+ public void contextInitialized(ServletContextEvent sce) {
+
+ // Only load logback configuration if GUACAMOLE_HOME exists
+ File guacamoleHome = GuacamoleHome.getDirectory();
+ if (!guacamoleHome.isDirectory())
+ return;
+
+ // Check for custom logback.xml
+ File logbackConfiguration = new File(guacamoleHome, "logback.xml");
+ if (!logbackConfiguration.exists())
+ return;
+
+ logger.info("Loading logback configuration from \"{}\".", logbackConfiguration);
+
+ LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+ try {
+
+ // Initialize logback
+ JoranConfigurator configurator = new JoranConfigurator();
+ configurator.setContext(context);
+ configurator.doConfigure(logbackConfiguration);
+
+ // Dump any errors that occur during logback init
+ StatusPrinter.printInCaseOfErrorsOrWarnings(context);
+
+ }
+ catch (JoranException e) {
+ logger.error("Initialization of logback failed: {}", e.getMessage());
+ logger.debug("Unable to load logback configuration..", e);
+ }
+
+ }
+
+}
+
diff --git a/guacamole/src/main/resources/logback.xml b/guacamole/src/main/resources/logback.xml
new file mode 100644
index 000000000..343554f68
--- /dev/null
+++ b/guacamole/src/main/resources/logback.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/guacamole/src/main/webapp/WEB-INF/web.xml b/guacamole/src/main/webapp/WEB-INF/web.xml
index 6a960a194..7c9985f62 100644
--- a/guacamole/src/main/webapp/WEB-INF/web.xml
+++ b/guacamole/src/main/webapp/WEB-INF/web.xml
@@ -37,6 +37,11 @@
org.glyptodon.guacamole.net.basic.websocket.WebSocketSupportLoader
+
+
+ org.glyptodon.guacamole.net.basic.log.LogbackInitializer
+
+
AuthenticatingFilter