@@ -25,6 +25,7 @@ import ch.qos.logback.classic.LoggerContext; | |||
import ch.qos.logback.core.ConsoleAppender; | |||
import org.slf4j.bridge.SLF4JBridgeHandler; | |||
import org.sonar.process.LogbackHelper; | |||
import org.sonar.process.Props; | |||
import java.util.logging.LogManager; | |||
@@ -38,13 +39,13 @@ class WebLogging { | |||
private final LogbackHelper helper = new LogbackHelper(); | |||
LoggerContext configure() { | |||
LoggerContext configure(Props props) { | |||
LoggerContext ctx = helper.getRootContext(); | |||
ctx.reset(); | |||
helper.enableJulChangePropagation(ctx); | |||
configureAppender(ctx); | |||
configureLevels(ctx); | |||
configureLevels(ctx, props); | |||
// Configure java.util.logging, used by Tomcat, in order to forward to slf4j | |||
LogManager.getLogManager().reset(); | |||
@@ -54,11 +55,10 @@ class WebLogging { | |||
private void configureAppender(LoggerContext ctx) { | |||
ConsoleAppender consoleAppender = helper.newConsoleAppender(ctx, "CONSOLE", LOG_FORMAT); | |||
Logger rootLogger = helper.configureLogger(ctx, Logger.ROOT_LOGGER_NAME, Level.INFO); | |||
rootLogger.addAppender(consoleAppender); | |||
ctx.getLogger(Logger.ROOT_LOGGER_NAME).addAppender(consoleAppender); | |||
} | |||
private void configureLevels(LoggerContext ctx) { | |||
private void configureLevels(LoggerContext ctx, Props props) { | |||
// override level of some loggers | |||
helper.configureLogger(ctx, "rails", Level.WARN); | |||
helper.configureLogger(ctx, "org.hibernate.cache.ReadWriteCache", Level.ERROR); | |||
@@ -72,5 +72,7 @@ class WebLogging { | |||
helper.configureLogger(ctx, "org.elasticsearch.node", Level.INFO); | |||
helper.configureLogger(ctx, "org.elasticsearch.http", Level.INFO); | |||
helper.configureLogger(ctx, "ch.qos.logback", Level.WARN); | |||
boolean debug = props.valueAsBoolean("sonar.log.debug", false); | |||
helper.configureLogger(ctx, Logger.ROOT_LOGGER_NAME, debug ? Level.DEBUG : Level.INFO); | |||
} | |||
} |
@@ -60,8 +60,9 @@ public class WebServer implements Monitored { | |||
*/ | |||
public static void main(String[] args) throws Exception { | |||
ProcessEntryPoint entryPoint = ProcessEntryPoint.createForArguments(args); | |||
new WebLogging().configure(); | |||
WebServer server = new WebServer(entryPoint.getProps()); | |||
Props props = entryPoint.getProps(); | |||
new WebLogging().configure(props); | |||
WebServer server = new WebServer(props); | |||
entryPoint.launch(server); | |||
} | |||
} |
@@ -27,11 +27,15 @@ import ch.qos.logback.core.ConsoleAppender; | |||
import org.junit.AfterClass; | |||
import org.junit.Test; | |||
import org.sonar.process.LogbackHelper; | |||
import org.sonar.process.Props; | |||
import java.util.Properties; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
public class WebLoggingTest { | |||
Props props = new Props(new Properties()); | |||
WebLogging sut = new WebLogging(); | |||
@AfterClass | |||
@@ -41,13 +45,22 @@ public class WebLoggingTest { | |||
@Test | |||
public void log_to_console() throws Exception { | |||
LoggerContext ctx = sut.configure(); | |||
LoggerContext ctx = sut.configure(props); | |||
Logger root = ctx.getLogger(Logger.ROOT_LOGGER_NAME); | |||
Appender appender = root.getAppender("CONSOLE"); | |||
assertThat(appender).isInstanceOf(ConsoleAppender.class); | |||
// default level is INFO | |||
assertThat(ctx.getLogger(Logger.ROOT_LOGGER_NAME).getLevel()).isEqualTo(Level.INFO); | |||
// change level of some loggers | |||
assertThat(ctx.getLogger("java.sql").getLevel()).isEqualTo(Level.WARN); | |||
} | |||
@Test | |||
public void enable_debug_logs() throws Exception { | |||
props.set("sonar.log.debug", "true"); | |||
LoggerContext ctx = sut.configure(props); | |||
assertThat(ctx.getLogger(Logger.ROOT_LOGGER_NAME).getLevel()).isEqualTo(Level.DEBUG); | |||
} | |||
} |
@@ -249,6 +249,8 @@ | |||
# and FULL (functional and technical details) | |||
#sonar.log.profilingLevel=NONE | |||
#sonar.log.debug=false | |||
# Path to log files. Can be absolute or relative to installation directory. | |||
# Default is <installation home>/logs | |||
#sonar.path.logs=logs |