From ca199e1ea6e709b0ed54b582587d18638153fe72 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 30 Oct 2014 11:42:22 -0700 Subject: [PATCH] GUAC-914: Migrate to logback and latest SLF4J. Read logback.xml from GUACAMOLE_HOME if present. --- extensions/guacamole-auth-mysql/pom.xml | 8 +- guacamole-common/pom.xml | 2 +- guacamole/pom.xml | 11 ++- .../net/basic/log/LogbackInitializer.java | 88 +++++++++++++++++++ guacamole/src/main/resources/logback.xml | 37 ++++++++ guacamole/src/main/webapp/WEB-INF/web.xml | 5 ++ 6 files changed, 137 insertions(+), 14 deletions(-) create mode 100644 guacamole/src/main/java/org/glyptodon/guacamole/net/basic/log/LogbackInitializer.java create mode 100644 guacamole/src/main/resources/logback.xml 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