/* * Copyright 2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gradle.internal.logging.slf4j; import org.gradle.api.logging.LogLevel; import org.gradle.internal.time.TimeProvider; import org.gradle.internal.logging.events.OutputEventListener; import org.gradle.internal.logging.sink.OutputEventRenderer; import org.slf4j.ILoggerFactory; import org.slf4j.Logger; import org.slf4j.Marker; import java.io.OutputStream; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; public class OutputEventListenerBackedLoggerContext implements ILoggerFactory { private static final LogLevel DEFAULT_LOG_LEVEL = LogLevel.LIFECYCLE; static final String HTTP_CLIENT_WIRE_LOGGER_NAME = "org.apache.http.wire"; static final String META_INF_EXTENSION_MODULE_LOGGER_NAME = "org.codehaus.groovy.runtime.m12n.MetaInfExtensionModule"; private final ConcurrentMap<String, Logger> loggers = new ConcurrentHashMap<String, Logger>(); private final OutputStream defaultOutputStream; private final OutputStream defaultErrorStream; private final AtomicReference<LogLevel> level = new AtomicReference<LogLevel>(); private final AtomicReference<OutputEventListener> outputEventListener = new AtomicReference<OutputEventListener>(); private final TimeProvider timeProvider; public OutputEventListenerBackedLoggerContext(OutputStream defaultOutputStream, OutputStream defaultErrorStream, TimeProvider timeProvider) { this.defaultOutputStream = defaultOutputStream; this.defaultErrorStream = defaultErrorStream; this.timeProvider = timeProvider; applyDefaultLoggersConfig(); reset(); } private void applyDefaultLoggersConfig() { addNoOpLogger(HTTP_CLIENT_WIRE_LOGGER_NAME); addNoOpLogger("org.apache.http.headers"); addNoOpLogger(META_INF_EXTENSION_MODULE_LOGGER_NAME); addNoOpLogger("org.littleshoot.proxy.HttpRequestHandler"); } private void addNoOpLogger(String name) { loggers.put(name, new NoOpLogger(name)); } public void setOutputEventListener(OutputEventListener outputEventListener) { this.outputEventListener.set(outputEventListener); } public OutputEventListener getOutputEventListener() { return outputEventListener.get(); } public Logger getLogger(String name) { Logger logger = loggers.get(name); if (logger != null) { return logger; } logger = loggers.putIfAbsent(name, new OutputEventListenerBackedLogger(name, this, timeProvider)); return logger != null ? logger : loggers.get(name); } public void reset() { setLevel(DEFAULT_LOG_LEVEL); OutputEventRenderer renderer = new OutputEventRenderer(); renderer.addStandardOutputListener(defaultOutputStream); renderer.addStandardErrorListener(defaultErrorStream); setOutputEventListener(renderer); } public LogLevel getLevel() { return level.get(); } public void setLevel(LogLevel level) { if (level == null) { throw new IllegalArgumentException("Global log level cannot be set to null"); } this.level.set(level); } private static class NoOpLogger implements org.gradle.api.logging.Logger { private final String name; public NoOpLogger(String name) { this.name = name; } @Override public String getName() { return name; } @Override public boolean isTraceEnabled() { return false; } @Override public void trace(String msg) { } @Override public void trace(String format, Object arg) { } @Override public void trace(String format, Object arg1, Object arg2) { } @Override public void trace(String format, Object... arguments) { } @Override public void trace(String msg, Throwable t) { } @Override public boolean isTraceEnabled(Marker marker) { return false; } @Override public void trace(Marker marker, String msg) { } @Override public void trace(Marker marker, String format, Object arg) { } @Override public void trace(Marker marker, String format, Object arg1, Object arg2) { } @Override public void trace(Marker marker, String format, Object... argArray) { } @Override public void trace(Marker marker, String msg, Throwable t) { } @Override public boolean isDebugEnabled() { return false; } @Override public void debug(String msg) { } @Override public void debug(String format, Object arg) { } @Override public void debug(String format, Object arg1, Object arg2) { } @Override public boolean isLifecycleEnabled() { return false; } @Override public void debug(String format, Object... arguments) { } @Override public void lifecycle(String message) { } @Override public void lifecycle(String message, Object... objects) { } @Override public void lifecycle(String message, Throwable throwable) { } @Override public void debug(String msg, Throwable t) { } @Override public boolean isDebugEnabled(Marker marker) { return false; } @Override public void debug(Marker marker, String msg) { } @Override public void debug(Marker marker, String format, Object arg) { } @Override public void debug(Marker marker, String format, Object arg1, Object arg2) { } @Override public void debug(Marker marker, String format, Object... arguments) { } @Override public void debug(Marker marker, String msg, Throwable t) { } @Override public boolean isInfoEnabled() { return false; } @Override public void info(String msg) { } @Override public void info(String format, Object arg) { } @Override public void info(String format, Object arg1, Object arg2) { } @Override public void info(String format, Object... arguments) { } @Override public boolean isQuietEnabled() { return false; } @Override public void quiet(String message) { } @Override public void quiet(String message, Object... objects) { } @Override public void quiet(String message, Throwable throwable) { } @Override public boolean isEnabled(LogLevel level) { return false; } @Override public void log(LogLevel level, String message) { } @Override public void log(LogLevel level, String message, Object... objects) { } @Override public void log(LogLevel level, String message, Throwable throwable) { } @Override public void info(String msg, Throwable t) { } @Override public boolean isInfoEnabled(Marker marker) { return false; } @Override public void info(Marker marker, String msg) { } @Override public void info(Marker marker, String format, Object arg) { } @Override public void info(Marker marker, String format, Object arg1, Object arg2) { } @Override public void info(Marker marker, String format, Object... arguments) { } @Override public void info(Marker marker, String msg, Throwable t) { } @Override public boolean isWarnEnabled() { return false; } @Override public void warn(String msg) { } @Override public void warn(String format, Object arg) { } @Override public void warn(String format, Object... arguments) { } @Override public void warn(String format, Object arg1, Object arg2) { } @Override public void warn(String msg, Throwable t) { } @Override public boolean isWarnEnabled(Marker marker) { return false; } @Override public void warn(Marker marker, String msg) { } @Override public void warn(Marker marker, String format, Object arg) { } @Override public void warn(Marker marker, String format, Object arg1, Object arg2) { } @Override public void warn(Marker marker, String format, Object... arguments) { } @Override public void warn(Marker marker, String msg, Throwable t) { } @Override public boolean isErrorEnabled() { return false; } @Override public void error(String msg) { } @Override public void error(String format, Object arg) { } @Override public void error(String format, Object arg1, Object arg2) { } @Override public void error(String format, Object... arguments) { } @Override public void error(String msg, Throwable t) { } @Override public boolean isErrorEnabled(Marker marker) { return false; } @Override public void error(Marker marker, String msg) { } @Override public void error(Marker marker, String format, Object arg) { } @Override public void error(Marker marker, String format, Object arg1, Object arg2) { } @Override public void error(Marker marker, String format, Object... arguments) { } @Override public void error(Marker marker, String msg, Throwable t) { } } }