Skip to content

Commit

Permalink
SONAR-6648 Rework redirection of logs
Browse files Browse the repository at this point in the history
  • Loading branch information
henryju committed Jun 25, 2015
1 parent 9c9d68f commit 30aaecc
Show file tree
Hide file tree
Showing 28 changed files with 278 additions and 402 deletions.
Expand Up @@ -23,15 +23,14 @@
import org.sonar.api.config.Settings;
import org.sonar.home.cache.FileCache;
import org.sonar.home.cache.FileCacheBuilder;
import org.sonar.home.log.Slf4jLog;

public class FileCacheProvider extends ProviderAdapter {
private FileCache cache;

public FileCache provide(Settings settings) {
if (cache == null) {
String home = settings.getString("sonar.userHome");
cache = new FileCacheBuilder().setLog(new Slf4jLog(FileCache.class)).setUserHome(home).build();
cache = new FileCacheBuilder(new Slf4jLogger()).setUserHome(home).build();
}
return cache;
}
Expand Down
Expand Up @@ -19,23 +19,19 @@
*/
package org.sonar.batch.bootstrap;

import org.sonar.home.log.Slf4jLog;
import org.sonar.home.cache.PersistentCacheBuilder;
import org.picocontainer.injectors.ProviderAdapter;

import java.nio.file.Paths;
import java.util.Map;

import org.picocontainer.injectors.ProviderAdapter;
import org.sonar.home.cache.PersistentCache;
import org.sonar.home.cache.PersistentCacheBuilder;

public class PersistentCacheProvider extends ProviderAdapter {
private PersistentCache cache;

public PersistentCache provide(UserProperties props) {
if (cache == null) {
PersistentCacheBuilder builder = new PersistentCacheBuilder();
PersistentCacheBuilder builder = new PersistentCacheBuilder(new Slf4jLogger());

builder.setLog(new Slf4jLog(PersistentCache.class));
builder.forceUpdate(isForceUpdate(props.properties()));

String home = props.property("sonar.userHome");
Expand Down
Expand Up @@ -17,46 +17,38 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.home.log;
package org.sonar.batch.bootstrap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Slf4jLog implements Log {
public class Slf4jLogger implements org.sonar.home.cache.Logger {

private final Logger logger;
private static final Logger LOG = LoggerFactory.getLogger(Slf4jLogger.class);

public Slf4jLog(Logger logger) {
this.logger = logger;
}

public Slf4jLog(Class loggerClass) {
this.logger = LoggerFactory.getLogger(loggerClass);
}

public boolean isDebugEnabled() {
return logger.isDebugEnabled();
@Override
public void debug(String msg) {
LOG.debug(msg);
}

@Override
public void debug(String s) {
logger.debug(s);
public void info(String msg) {
LOG.info(msg);
}

@Override
public void info(String s) {
logger.info(s);
public void warn(String msg) {
LOG.warn(msg);
}

@Override
public void warn(String s) {
logger.warn(s);
public void error(String msg, Throwable t) {
LOG.error(msg, t);
}

@Override
public void error(String s, Throwable throwable) {
logger.error(s, throwable);
public void error(String msg) {
LOG.error(msg);
}


}
17 changes: 7 additions & 10 deletions sonar-batch/src/main/java/org/sonar/batch/bootstrapper/Batch.java
Expand Up @@ -19,16 +19,13 @@
*/
package org.sonar.batch.bootstrapper;

import org.sonar.home.log.LogListener;

import org.picocontainer.annotations.Nullable;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.sonar.batch.bootstrap.GlobalContainer;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.picocontainer.annotations.Nullable;
import org.sonar.batch.bootstrap.GlobalContainer;

/**
* Entry point for sonar-runner 2.1.
Expand All @@ -55,8 +52,8 @@ private Batch(Builder builder) {
if (builder.isEnableLoggingConfiguration()) {
loggingConfig = new LoggingConfiguration(builder.environment).setProperties(bootstrapProperties);

if (builder.listener != null) {
loggingConfig.setListener(builder.listener);
if (builder.logOutput != null) {
loggingConfig.setLogOutput(builder.logOutput);
}
}
}
Expand Down Expand Up @@ -131,7 +128,7 @@ public static final class Builder {
private EnvironmentInformation environment;
private List<Object> components = Lists.newArrayList();
private boolean enableLoggingConfiguration = true;
private LogListener listener;
private LogOutput logOutput;

private Builder() {
}
Expand All @@ -146,8 +143,8 @@ public Builder setComponents(List<Object> l) {
return this;
}

public Builder setLogListener(@Nullable LogListener listener) {
this.listener = listener;
public Builder setLogOutput(@Nullable LogOutput logOutput) {
this.logOutput = logOutput;
return this;
}

Expand Down
Expand Up @@ -19,41 +19,39 @@
*/
package org.sonar.batch.bootstrapper;

import org.sonar.home.log.LogListener;

import ch.qos.logback.classic.Level;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;

public class LogCallbackAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
protected LogListener target;
protected LogOutput target;

public LogCallbackAppender(LogListener target) {
public LogCallbackAppender(LogOutput target) {
setTarget(target);
}

public void setTarget(LogListener target) {
public void setTarget(LogOutput target) {
this.target = target;
}

@Override
protected void append(ILoggingEvent event) {
target.log(event.getMessage(), translate(event.getLevel()));
target.log(event.getFormattedMessage(), translate(event.getLevel()));
}

private static LogListener.Level translate(Level level) {
private static LogOutput.Level translate(Level level) {
switch (level.toInt()) {
case Level.ERROR_INT:
return LogListener.Level.ERROR;
return LogOutput.Level.ERROR;
case Level.WARN_INT:
return LogListener.Level.WARN;
return LogOutput.Level.WARN;
case Level.INFO_INT:
return LogListener.Level.INFO;
return LogOutput.Level.INFO;
case Level.DEBUG_INT:
default:
return LogListener.Level.DEBUG;
return LogOutput.Level.DEBUG;
case Level.TRACE_INT:
return LogListener.Level.TRACE;
return LogOutput.Level.TRACE;
}
}
}
Expand Up @@ -17,11 +17,16 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.home.log;
package org.sonar.batch.bootstrapper;

/**
* Allow to redirect batch logs to a custom output. By defaults logs are written to System.out
* @since 5.2
*/
public interface LogOutput {

void log(String formattedMessage, Level level);

public interface LogListener {
void log(String msg, Level level);

enum Level {
ERROR, WARN, INFO, DEBUG, TRACE;
}
Expand Down
Expand Up @@ -19,15 +19,11 @@
*/
package org.sonar.batch.bootstrapper;

import org.sonar.home.log.LogListener;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;

import javax.annotation.Nullable;

import java.util.Map;
import javax.annotation.Nullable;
import org.apache.commons.lang.StringUtils;

/**
* @since 2.14
Expand All @@ -47,8 +43,8 @@ public final class LoggingConfiguration {
@VisibleForTesting
static final String FORMAT_MAVEN = "[%level] [%d{HH:mm:ss.SSS}] %msg%n";

Map<String, String> substitutionVariables = Maps.newHashMap();
LogListener listener = null;
private Map<String, String> substitutionVariables = Maps.newHashMap();
private LogOutput logOutput = null;

public LoggingConfiguration() {
this(null);
Expand All @@ -69,8 +65,8 @@ public LoggingConfiguration setProperties(Map<String, String> properties) {
return this;
}

public LoggingConfiguration setListener(@Nullable LogListener listener) {
this.listener = listener;
public LoggingConfiguration setLogOutput(@Nullable LogOutput listener) {
this.logOutput = listener;
return this;
}

Expand Down Expand Up @@ -118,4 +114,12 @@ public LoggingConfiguration addSubstitutionVariable(String key, String value) {
String getSubstitutionVariable(String key) {
return substitutionVariables.get(key);
}

Map<String, String> getSubstitutionVariables() {
return substitutionVariables;
}

LogOutput getLogOutput() {
return logOutput;
}
}
Expand Up @@ -19,16 +19,12 @@
*/
package org.sonar.batch.bootstrapper;

import org.sonar.home.log.LogListener;

import ch.qos.logback.core.Appender;
import ch.qos.logback.classic.Level;
import org.apache.commons.lang.StringUtils;

import java.io.File;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import java.io.File;
import org.apache.commons.lang.StringUtils;
import org.slf4j.LoggerFactory;
import org.sonar.core.config.Logback;

Expand All @@ -37,9 +33,9 @@ private LoggingConfigurator() {
}

public static void apply(LoggingConfiguration conf, File logbackFile) {
Logback.configure(logbackFile, conf.substitutionVariables);
Logback.configure(logbackFile, conf.getSubstitutionVariables());

if (conf.listener != null) {
if (conf.getLogOutput() != null) {
setCustomRootAppender(conf);
}
}
Expand All @@ -49,25 +45,25 @@ public static void apply(LoggingConfiguration conf) {
}

public static void apply(LoggingConfiguration conf, String classloaderPath) {
Logback.configure(classloaderPath, conf.substitutionVariables);
Logback.configure(classloaderPath, conf.getSubstitutionVariables());

// if not set, keep default behavior (configured to stdout through the file in classpath)
if (conf.listener != null) {
if (conf.getLogOutput() != null) {
setCustomRootAppender(conf);
}
}

private static void setCustomRootAppender(LoggingConfiguration conf) {
Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
String pattern = StringUtils.defaultIfBlank(conf.substitutionVariables.get(LoggingConfiguration.PROPERTY_FORMAT), LoggingConfiguration.FORMAT_DEFAULT);
String level = StringUtils.defaultIfBlank(conf.substitutionVariables.get(LoggingConfiguration.PROPERTY_ROOT_LOGGER_LEVEL), LoggingConfiguration.LEVEL_ROOT_DEFAULT);
String pattern = StringUtils.defaultIfBlank(conf.getSubstitutionVariables().get(LoggingConfiguration.PROPERTY_FORMAT), LoggingConfiguration.FORMAT_DEFAULT);
String level = StringUtils.defaultIfBlank(conf.getSubstitutionVariables().get(LoggingConfiguration.PROPERTY_ROOT_LOGGER_LEVEL), LoggingConfiguration.LEVEL_ROOT_DEFAULT);

logger.detachAndStopAllAppenders();
logger.addAppender(createAppender(pattern, conf.listener));
logger.addAppender(createAppender(pattern, conf.getLogOutput()));
logger.setLevel(Level.toLevel(level));
}

private static Appender<ILoggingEvent> createAppender(String pattern, LogListener target) {
private static Appender<ILoggingEvent> createAppender(String pattern, LogOutput target) {
LogCallbackAppender appender = new LogCallbackAppender(target);
appender.setName("custom_stream");
appender.start();
Expand Down

0 comments on commit 30aaecc

Please sign in to comment.