diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporter.java
index 7a3076e93e..cdcceca3af 100644
--- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporter.java
+++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporter.java
@@ -111,7 +111,7 @@ public class EndpointMBeanExporter extends MBeanExporter implements SmartLifecyc
this.beanFactory = (ListableBeanFactory) beanFactory;
}
else {
- logger.info("EndpointMBeanExporter not running in a ListableBeanFactory: "
+ logger.warn("EndpointMBeanExporter not running in a ListableBeanFactory: "
+ "autodetection of Endpoints not available.");
}
}
diff --git a/spring-boot-cli/src/test/resources/logback.xml b/spring-boot-cli/src/test/resources/logback.xml
deleted file mode 100644
index 566ec197ec..0000000000
--- a/spring-boot-cli/src/test/resources/logback.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/spring-boot-samples/spring-boot-sample-actuator-log4j/src/main/java/sample/actuator/log4j/SampleActuatorApplication.java b/spring-boot-samples/spring-boot-sample-actuator-log4j/src/main/java/sample/actuator/log4j/SampleActuatorLog4JApplication.java
similarity index 90%
rename from spring-boot-samples/spring-boot-sample-actuator-log4j/src/main/java/sample/actuator/log4j/SampleActuatorApplication.java
rename to spring-boot-samples/spring-boot-sample-actuator-log4j/src/main/java/sample/actuator/log4j/SampleActuatorLog4JApplication.java
index 510ff7307c..d75731aceb 100644
--- a/spring-boot-samples/spring-boot-sample-actuator-log4j/src/main/java/sample/actuator/log4j/SampleActuatorApplication.java
+++ b/spring-boot-samples/spring-boot-sample-actuator-log4j/src/main/java/sample/actuator/log4j/SampleActuatorLog4JApplication.java
@@ -26,10 +26,10 @@ import org.springframework.context.annotation.Configuration;
@EnableAutoConfiguration
@EnableConfigurationProperties
@ComponentScan
-public class SampleActuatorApplication {
+public class SampleActuatorLog4JApplication {
public static void main(String[] args) throws Exception {
- SpringApplication.run(SampleActuatorApplication.class, args);
+ SpringApplication.run(SampleActuatorLog4JApplication.class, args);
}
}
diff --git a/spring-boot-samples/spring-boot-sample-actuator-log4j/src/test/java/sample/actuator/log4j/SampleActuatorApplicationTests.java b/spring-boot-samples/spring-boot-sample-actuator-log4j/src/test/java/sample/actuator/log4j/SampleActuatorApplicationTests.java
index f3b37bca4b..1137113d76 100644
--- a/spring-boot-samples/spring-boot-sample-actuator-log4j/src/test/java/sample/actuator/log4j/SampleActuatorApplicationTests.java
+++ b/spring-boot-samples/spring-boot-sample-actuator-log4j/src/test/java/sample/actuator/log4j/SampleActuatorApplicationTests.java
@@ -38,7 +38,7 @@ import static org.junit.Assert.assertEquals;
* @author Dave Syer
*/
@RunWith(SpringJUnit4ClassRunner.class)
-@SpringApplicationConfiguration(classes = SampleActuatorApplication.class)
+@SpringApplicationConfiguration(classes = SampleActuatorLog4JApplication.class)
@WebAppConfiguration
@IntegrationTest("server.port=0")
@DirtiesContext
diff --git a/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/main/java/sample/actuator/log4j2/SampleActuatorApplication.java b/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/main/java/sample/actuator/log4j2/SampleActuatorLog4J2Application.java
similarity index 90%
rename from spring-boot-samples/spring-boot-sample-actuator-log4j2/src/main/java/sample/actuator/log4j2/SampleActuatorApplication.java
rename to spring-boot-samples/spring-boot-sample-actuator-log4j2/src/main/java/sample/actuator/log4j2/SampleActuatorLog4J2Application.java
index 9d2cc38678..a7b840a4d2 100644
--- a/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/main/java/sample/actuator/log4j2/SampleActuatorApplication.java
+++ b/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/main/java/sample/actuator/log4j2/SampleActuatorLog4J2Application.java
@@ -26,10 +26,10 @@ import org.springframework.context.annotation.Configuration;
@EnableAutoConfiguration
@EnableConfigurationProperties
@ComponentScan
-public class SampleActuatorApplication {
+public class SampleActuatorLog4J2Application {
public static void main(String[] args) throws Exception {
- SpringApplication.run(SampleActuatorApplication.class, args);
+ SpringApplication.run(SampleActuatorLog4J2Application.class, args);
}
}
diff --git a/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/test/java/sample/actuator/log4j2/SampleActuatorApplicationTests.java b/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/test/java/sample/actuator/log4j2/SampleActuatorApplicationTests.java
index ad5c29a82c..f9a8c2b6cd 100644
--- a/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/test/java/sample/actuator/log4j2/SampleActuatorApplicationTests.java
+++ b/spring-boot-samples/spring-boot-sample-actuator-log4j2/src/test/java/sample/actuator/log4j2/SampleActuatorApplicationTests.java
@@ -38,7 +38,7 @@ import static org.junit.Assert.assertEquals;
* @author Dave Syer
*/
@RunWith(SpringJUnit4ClassRunner.class)
-@SpringApplicationConfiguration(classes = SampleActuatorApplication.class)
+@SpringApplicationConfiguration(classes = SampleActuatorLog4J2Application.class)
@WebAppConfiguration
@IntegrationTest("server.port=0")
@DirtiesContext
diff --git a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java
index 27c9d1d858..552e9df024 100644
--- a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java
+++ b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java
@@ -282,13 +282,12 @@ public class SpringApplication {
// Create and configure the environment
ConfigurableEnvironment environment = getOrCreateEnvironment();
configureEnvironment(environment, args);
- for (SpringApplicationRunListener runListener : runListeners) {
- runListener.environmentPrepared(environment);
- }
-
if (this.showBanner) {
printBanner(environment);
}
+ for (SpringApplicationRunListener runListener : runListeners) {
+ runListener.environmentPrepared(environment);
+ }
// Create, load, refresh and run the ApplicationContext
context = createApplicationContext();
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java
index 04e164ed53..fc4f9c3fbf 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java
@@ -19,6 +19,7 @@ package org.springframework.boot.logging;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
+import org.springframework.util.SystemPropertyUtils;
/**
* Abstract base class for {@link LoggingSystem} implementations.
@@ -30,50 +31,70 @@ public abstract class AbstractLoggingSystem extends LoggingSystem {
private final ClassLoader classLoader;
- private final String[] paths;
-
- private boolean fileOutput;
-
- private boolean consoleOutput;
-
public AbstractLoggingSystem(ClassLoader classLoader) {
- this(classLoader, false, true);
- }
-
- public AbstractLoggingSystem(ClassLoader classLoader, boolean fileOutput,
- boolean consoleOutput) {
this.classLoader = classLoader;
- this.fileOutput = fileOutput;
- this.consoleOutput = consoleOutput;
- this.paths = getLogFileNames();
- }
-
- protected abstract String[] getLogFileNames();
-
- protected final ClassLoader getClassLoader() {
- return this.classLoader;
}
@Override
public void beforeInitialize() {
- initializeWithSensibleDefaults();
}
@Override
- public void initialize() {
- for (String path : this.paths) {
- ClassPathResource resource = new ClassPathResource(path, this.classLoader);
+ public void initialize(String configLocation, String logFile) {
+ if (StringUtils.hasLength(configLocation)) {
+ // Load a specific configuration
+ configLocation = SystemPropertyUtils.resolvePlaceholders(configLocation);
+ loadConfiguration(configLocation, logFile);
+ }
+ else {
+ String selfInitializationConfig = getSelfInitializationConfig();
+ if (selfInitializationConfig == null) {
+ // No self initialization has occurred, use defaults
+ loadDefaults(logFile);
+ }
+ else if (StringUtils.hasLength(logFile)) {
+ // Self initialization has occurred but the file has changed, reload
+ loadConfiguration(selfInitializationConfig, logFile);
+ }
+ }
+ }
+
+ /**
+ * Return any self initialization config that has been applied. By default this method
+ * checks {@link #getStandardConfigLocations()} and assumes that any file that exists
+ * will have been applied.
+ */
+ protected String getSelfInitializationConfig() {
+ for (String location : getStandardConfigLocations()) {
+ ClassPathResource resource = new ClassPathResource(location, this.classLoader);
if (resource.exists()) {
- initialize("classpath:" + path);
- return;
+ return "classpath:" + location;
}
}
- // Fallback to the non-prefixed value taking into account file and console preferences
- initialize(getPackagedConfigFile(addChannels(this.paths[this.paths.length - 1])));
+ return null;
}
- protected void initializeWithSensibleDefaults() {
- initialize(getPackagedConfigFile("basic-" + this.paths[this.paths.length - 1]));
+ /**
+ * Return the standard config locations for this system.
+ * @see #getSelfInitializationConfig()
+ */
+ protected abstract String[] getStandardConfigLocations();
+
+ /**
+ * Load sensible defaults for the logging system.
+ * @param logFile the file to load or {@code null} if no log file is to be written
+ */
+ protected abstract void loadDefaults(String logFile);
+
+ /**
+ * Load a specific configuration.
+ * @param location the location of the configuration to load (never {@code null})
+ * @param logFile the file to load or {@code null} if no log file is to be written
+ */
+ protected abstract void loadConfiguration(String location, String logFile);
+
+ protected final ClassLoader getClassLoader() {
+ return this.classLoader;
}
protected final String getPackagedConfigFile(String fileName) {
@@ -84,14 +105,4 @@ public abstract class AbstractLoggingSystem extends LoggingSystem {
return defaultPath;
}
- private String addChannels(String fileName) {
- String extension = "." + StringUtils.getFilenameExtension(fileName);
- return fileName.replace(extension, getChannel() + extension);
- }
-
- private String getChannel() {
- return (fileOutput && consoleOutput) ? "-file-console" : (fileOutput ? "-file"
- : (consoleOutput ? "" : "-none"));
- }
-
}
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java
index ef8671ddde..745aaa1899 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java
@@ -16,7 +16,6 @@
package org.springframework.boot.logging;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -41,49 +40,27 @@ import org.springframework.util.ResourceUtils;
import org.springframework.util.StringUtils;
/**
- * An {@link ApplicationListener} that configures a logging framework depending on what it
- * finds on the classpath and in the {@link Environment}. If the environment contains a
- * property logging.config
then that will be used to initialize the logging
- * system, otherwise a default location is used. The classpath is probed for log4j and
- * logback and if those are present they will be reconfigured, otherwise vanilla
- * java.util.logging
will be used.
+ * An {@link ApplicationListener} that configures the {@link LoggingSystem}. If the
+ * environment contains a {@code logging.config} property a then that will be used to
+ * initialize the logging system, otherwise a default configuration is used.
*
- * The default config locations are classpath:log4j.properties
or
- * classpath:log4j.xml
for log4j; classpath:logback.xml
for
- * logback; and classpath:logging.properties
for
- * java.util.logging
. If the correct one of those files is not found then
- * some sensible defaults are adopted from files of the same name but in the package
- * containing {@link LoggingApplicationListener}.
+ * By default, log output is only written to the console. If a log file is required the
+ * {@code logging.path} and {@code logging.file} properties can be used.
*
* Some system properties may be set as side effects, and these can be useful if the
* logging configuration supports placeholders (i.e. log4j or logback):
*
- * LOG_FILE
is set to the value of logging.file
if found in
- * the environment
- * LOG_PATH
is set to the value of logging.path
if found in
- * the environment
- * PID
is set to the value of the current process ID if it can be
- * determined
+ * - {@code LOG_FILE} is set to the value of path of the log file that should be written
+ * (if any).
+ * - {@code PID} is set to the value of the current process ID if it can be determined.
*
*
* @author Dave Syer
* @author Phillip Webb
+ * @see LoggingSystem#get(ClassLoader)
*/
public class LoggingApplicationListener implements SmartApplicationListener {
- private static final Map ENVIRONMENT_SYSTEM_PROPERTY_MAPPING;
-
- public static final String PID_KEY = "PID";
-
- public static final String LOG_FILE = "LOG_FILE";
-
- static {
- ENVIRONMENT_SYSTEM_PROPERTY_MAPPING = new HashMap();
- ENVIRONMENT_SYSTEM_PROPERTY_MAPPING.put("logging.file", "LOG_FILE");
- ENVIRONMENT_SYSTEM_PROPERTY_MAPPING.put("logging.path", "LOG_PATH");
- ENVIRONMENT_SYSTEM_PROPERTY_MAPPING.put(PID_KEY, PID_KEY);
- }
-
private static MultiValueMap LOG_LEVEL_LOGGERS;
static {
LOG_LEVEL_LOGGERS = new LinkedMultiValueMap();
@@ -96,9 +73,6 @@ public class LoggingApplicationListener implements SmartApplicationListener {
LOG_LEVEL_LOGGERS.add(LogLevel.DEBUG, "org.hibernate.SQL");
}
- private static Class>[] EVENT_TYPES = { ApplicationStartedEvent.class,
- ApplicationEnvironmentPreparedEvent.class };
-
private final Log logger = LogFactory.getLog(getClass());
private int order = Ordered.HIGHEST_PRECEDENCE + 11;
@@ -109,12 +83,8 @@ public class LoggingApplicationListener implements SmartApplicationListener {
@Override
public boolean supportsEventType(Class extends ApplicationEvent> eventType) {
- for (Class> type : EVENT_TYPES) {
- if (type.isAssignableFrom(eventType)) {
- return true;
- }
- }
- return false;
+ return ApplicationStartedEvent.class.isAssignableFrom(eventType)
+ || ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType);
}
@Override
@@ -124,39 +94,32 @@ public class LoggingApplicationListener implements SmartApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) {
- if (event instanceof ApplicationEnvironmentPreparedEvent) {
- ApplicationEnvironmentPreparedEvent available = (ApplicationEnvironmentPreparedEvent) event;
- initialize(available.getEnvironment(), available.getSpringApplication()
- .getClassLoader());
+ if (event instanceof ApplicationStartedEvent) {
+ onApplicationStartedEvent((ApplicationStartedEvent) event);
}
- else {
- if (System.getProperty(PID_KEY) == null) {
- System.setProperty(PID_KEY, new ApplicationPid().toString());
- }
- LoggingSystem loggingSystem = LoggingSystem.get(ClassUtils.getDefaultClassLoader(), false, false);
- loggingSystem.beforeInitialize();
+ else if (event instanceof ApplicationEnvironmentPreparedEvent) {
+ onApplicationPreparedEvent((ApplicationEnvironmentPreparedEvent) event);
}
}
+ private void onApplicationStartedEvent(ApplicationStartedEvent event) {
+ LoggingSystem.get(ClassUtils.getDefaultClassLoader()).beforeInitialize();
+ }
+
+ private void onApplicationPreparedEvent(ApplicationEnvironmentPreparedEvent event) {
+ initialize(event.getEnvironment(), event.getSpringApplication().getClassLoader());
+ }
+
/**
* Initialize the logging system according to preferences expressed through the
* {@link Environment} and the classpath.
*/
protected void initialize(ConfigurableEnvironment environment, ClassLoader classLoader) {
- initializeEarlyLoggingLevel(environment);
- cleanLogTempProperty();
- boolean fileOutput = !StringUtils.isEmpty(environment.getProperty("logging.file"));
- boolean consoleOutput = true;
- if (!StringUtils.isEmpty(environment.getProperty("logging.console"))
- && environment.getProperty("logging.console").equalsIgnoreCase("false")) {
- consoleOutput = false;
- }
- LoggingSystem system = LoggingSystem.get(classLoader, fileOutput, consoleOutput);
- boolean systemEnvironmentChanged = mapSystemPropertiesFromSpring(environment);
- if (systemEnvironmentChanged) {
- // Re-initialize the defaults in case the system Environment changed
- system.beforeInitialize();
+ if (System.getProperty("PID") == null) {
+ System.setProperty("PID", new ApplicationPid().toString());
}
+ initializeEarlyLoggingLevel(environment);
+ LoggingSystem system = LoggingSystem.get(classLoader);
initializeSystem(environment, system);
initializeFinalLoggingLevels(environment, system);
}
@@ -172,52 +135,45 @@ public class LoggingApplicationListener implements SmartApplicationListener {
}
}
- private void cleanLogTempProperty() {
- // Logback won't read backslashes so add a clean path for it to use
- if (!StringUtils.hasLength(System.getProperty("LOG_TEMP"))) {
- String path = System.getProperty("java.io.tmpdir");
- path = StringUtils.cleanPath(path);
- if (path.endsWith("/")) {
- path = path.substring(0, path.length() - 1);
- }
- System.setProperty("LOG_TEMP", path);
- }
- }
-
- private boolean mapSystemPropertiesFromSpring(Environment environment) {
- boolean changed = false;
- for (Map.Entry mapping : ENVIRONMENT_SYSTEM_PROPERTY_MAPPING
- .entrySet()) {
- String springName = mapping.getKey();
- String systemName = mapping.getValue();
- if (environment.containsProperty(springName)) {
- System.setProperty(systemName, environment.getProperty(springName));
- changed = true;
- }
- }
- return changed;
- }
-
private void initializeSystem(ConfigurableEnvironment environment,
LoggingSystem system) {
- if (environment.containsProperty("logging.config")) {
- String value = environment.getProperty("logging.config");
+ String logFile = getLogFile(environment);
+ String logConfig = environment.getProperty("logging.config");
+ if (StringUtils.hasLength(logConfig)) {
try {
- ResourceUtils.getURL(value).openStream().close();
- system.initialize(value);
+ ResourceUtils.getURL(logConfig).openStream().close();
+ system.initialize(logConfig, logFile);
}
catch (Exception ex) {
- this.logger.warn("Logging environment value '" + value
+ this.logger.warn("Logging environment value '" + logConfig
+ "' cannot be opened and will be ignored "
+ "(using default location instead)");
- system.initialize();
+ system.initialize(null, logFile);
}
}
else {
- system.initialize();
+ system.initialize(null, logFile);
}
}
+ private String getLogFile(ConfigurableEnvironment environment) {
+ String file = environment.getProperty("logging.file");
+ String path = environment.getProperty("logging.path");
+ if (StringUtils.hasLength(path) || StringUtils.hasLength(file)) {
+ if (!StringUtils.hasLength(file)) {
+ file = "spring.log";
+ }
+ if (!StringUtils.hasLength(path) && !file.contains("/")) {
+ path = StringUtils.cleanPath(System.getProperty("java.io.tmpdir"));
+ }
+ if (StringUtils.hasLength(path)) {
+ return StringUtils.applyRelativePath(path, file);
+ }
+ return file;
+ }
+ return null;
+ }
+
private void initializeFinalLoggingLevels(ConfigurableEnvironment environment,
LoggingSystem system) {
if (this.springBootLogging != null) {
@@ -226,7 +182,16 @@ public class LoggingApplicationListener implements SmartApplicationListener {
setLogLevels(system, environment);
}
- public void setLogLevels(LoggingSystem system, Environment environment) {
+ protected void initializeLogLevel(LoggingSystem system, LogLevel level) {
+ List loggers = LOG_LEVEL_LOGGERS.get(level);
+ if (loggers != null) {
+ for (String logger : loggers) {
+ system.setLogLevel(logger, level);
+ }
+ }
+ }
+
+ protected void setLogLevels(LoggingSystem system, Environment environment) {
Map levels = new RelaxedPropertyResolver(environment)
.getSubProperties("logging.level.");
for (Entry entry : levels.entrySet()) {
@@ -248,15 +213,6 @@ public class LoggingApplicationListener implements SmartApplicationListener {
}
}
- protected void initializeLogLevel(LoggingSystem system, LogLevel level) {
- List loggers = LOG_LEVEL_LOGGERS.get(level);
- if (loggers != null) {
- for (String logger : loggers) {
- system.setLogLevel(logger, level);
- }
- }
- }
-
public void setOrder(int order) {
this.order = order;
}
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.java
index 168b0460d5..38099c1a83 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.java
@@ -33,35 +33,32 @@ public abstract class LoggingSystem {
private static final Map SYSTEMS;
static {
Map systems = new LinkedHashMap();
- String pkg = LoggingSystem.class.getPackage().getName();
- systems.put("ch.qos.logback.core.Appender", pkg + ".logback.LogbackLoggingSystem");
- systems.put("org.apache.log4j.PropertyConfigurator", pkg
- + ".log4j.Log4JLoggingSystem");
- systems.put("org.apache.logging.log4j.LogManager", pkg
- + ".log4j2.Log4J2LoggingSystem");
- systems.put("java.util.logging.LogManager", pkg + ".java.JavaLoggingSystem");
+ systems.put("ch.qos.logback.core.Appender",
+ "org.springframework.boot.logging.logback.LogbackLoggingSystem");
+ systems.put("org.apache.log4j.PropertyConfigurator",
+ "org.springframework.boot.logging.log4j.Log4JLoggingSystem");
+ systems.put("org.apache.logging.log4j.LogManager",
+ "org.springframework.boot.logging.log4j2.Log4J2LoggingSystem");
+ systems.put("java.util.logging.LogManager",
+ "org.springframework.boot.logging.java.JavaLoggingSystem");
SYSTEMS = Collections.unmodifiableMap(systems);
}
/**
* Reset the logging system to be limit output. This method may be called before
- * {@link #initialize()} to reduce logging noise until the systems has been full
- * Initialized.
+ * {@link #initialize(String, String)} to reduce logging noise until the systems has
+ * been fully Initialized.
*/
public abstract void beforeInitialize();
/**
- * Initialize the logging system using sensible defaults. This method should generally
- * try to find system specific configuration on classpath before falling back to
- * sensible defaults.
+ * Fully initialize the logging system.
+ * @param configLocation a log configuration location or {@code null} if default
+ * initialization is required
+ * @param logFile the log output file that should be written or {@code null} for
+ * console only output
*/
- public abstract void initialize();
-
- /**
- * Initialize the logging system from a logging configuration location.
- * @param configLocation a log configuration location
- */
- public abstract void initialize(String configLocation);
+ public abstract void initialize(String configLocation, String logFile);
/**
* Sets the logging level for a given logger.
@@ -71,17 +68,18 @@ public abstract class LoggingSystem {
public abstract void setLogLevel(String loggerName, LogLevel level);
/**
- * Detect and return the logging system in use.
+ * Detect and return the logging system in use. Supports Logback, Log4J, Log4J2 and
+ * Java Logging.
* @return The logging system
*/
- public static LoggingSystem get(ClassLoader classLoader, boolean fileOutput, boolean consoleOutput) {
+ public static LoggingSystem get(ClassLoader classLoader) {
for (Map.Entry entry : SYSTEMS.entrySet()) {
if (ClassUtils.isPresent(entry.getKey(), classLoader)) {
try {
Class> systemClass = ClassUtils.forName(entry.getValue(),
classLoader);
- return (LoggingSystem) systemClass.getConstructor(ClassLoader.class, boolean.class, boolean.class)
- .newInstance(classLoader, fileOutput, consoleOutput);
+ return (LoggingSystem) systemClass.getConstructor(ClassLoader.class)
+ .newInstance(classLoader);
}
catch (Exception ex) {
throw new IllegalStateException(ex);
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java
index 254b94b209..d3f4545371 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java
@@ -27,16 +27,17 @@ import org.springframework.util.ClassUtils;
*/
public abstract class Slf4JLoggingSystem extends AbstractLoggingSystem {
- public Slf4JLoggingSystem(ClassLoader classLoader, boolean fileOutput, boolean consoleOutput) {
- super(classLoader, fileOutput, consoleOutput);
+ private static final String BRIDGE_HANDLER = "org.slf4j.bridge.SLF4JBridgeHandler";
+
+ public Slf4JLoggingSystem(ClassLoader classLoader) {
+ super(classLoader);
}
@Override
public void beforeInitialize() {
super.beforeInitialize();
try {
- if (ClassUtils.isPresent("org.slf4j.bridge.SLF4JBridgeHandler",
- getClassLoader())) {
+ if (ClassUtils.isPresent(BRIDGE_HANDLER, getClassLoader())) {
try {
SLF4JBridgeHandler.removeHandlersForRootLogger();
}
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/java/JavaLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/java/JavaLoggingSystem.java
index edb36db470..51cd358cd7 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/java/JavaLoggingSystem.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/java/JavaLoggingSystem.java
@@ -16,6 +16,8 @@
package org.springframework.boot.logging.java;
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -27,8 +29,9 @@ import org.springframework.boot.logging.AbstractLoggingSystem;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.util.Assert;
+import org.springframework.util.FileCopyUtils;
import org.springframework.util.ResourceUtils;
-import org.springframework.util.SystemPropertyUtils;
+import org.springframework.util.StringUtils;
/**
* {@link LoggingSystem} for {@link Logger java.util.logging}.
@@ -52,30 +55,46 @@ public class JavaLoggingSystem extends AbstractLoggingSystem {
}
public JavaLoggingSystem(ClassLoader classLoader) {
- this(classLoader, false, true);
- }
-
- public JavaLoggingSystem(ClassLoader classLoader, boolean fileOutput,
- boolean consoleOutput) {
- super(classLoader, fileOutput, consoleOutput);
+ super(classLoader);
}
@Override
- protected String[] getLogFileNames() {
+ protected String[] getStandardConfigLocations() {
return new String[] { "logging.properties" };
}
@Override
- public void initialize(String configLocation) {
- Assert.notNull(configLocation, "ConfigLocation must not be null");
- String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(configLocation);
+ public void beforeInitialize() {
+ super.beforeInitialize();
+ Logger.getLogger("").setLevel(Level.SEVERE);
+ }
+
+ @Override
+ protected void loadDefaults(String logFile) {
+ if (StringUtils.hasLength(logFile)) {
+ loadConfiguration(getPackagedConfigFile("logging-file.properties"), logFile);
+ }
+ else {
+ loadConfiguration(getPackagedConfigFile("logging.properties"), logFile);
+ }
+ }
+
+ @Override
+ protected void loadConfiguration(String location, String logFile) {
+ Assert.notNull(location, "Location must not be null");
try {
+ String configuration = FileCopyUtils.copyToString(new InputStreamReader(
+ ResourceUtils.getURL(location).openStream()));
+ if (StringUtils.hasLength(logFile)) {
+ configuration = configuration.replace("${LOG_FILE}",
+ StringUtils.cleanPath(logFile));
+ }
LogManager.getLogManager().readConfiguration(
- ResourceUtils.getURL(resolvedLocation).openStream());
+ new ByteArrayInputStream(configuration.getBytes()));
}
catch (Exception ex) {
- throw new IllegalStateException("Could not initialize logging from "
- + configLocation, ex);
+ throw new IllegalStateException("Could not initialize Java logging from "
+ + location, ex);
}
}
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java
index 43a76ed820..9b234188c8 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java
@@ -52,28 +52,42 @@ public class Log4JLoggingSystem extends Slf4JLoggingSystem {
}
public Log4JLoggingSystem(ClassLoader classLoader) {
- this(classLoader, false, true);
- }
-
- public Log4JLoggingSystem(ClassLoader classLoader, boolean fileOutput,
- boolean consoleOutput) {
- super(classLoader, fileOutput, consoleOutput);
+ super(classLoader);
}
@Override
- protected String[] getLogFileNames() {
+ protected String[] getStandardConfigLocations() {
return new String[] { "log4j.xml", "log4j.properties" };
}
@Override
- public void initialize(String configLocation) {
- Assert.notNull(configLocation, "ConfigLocation must not be null");
+ public void beforeInitialize() {
+ super.beforeInitialize();
+ LogManager.getRootLogger().setLevel(Level.FATAL);
+ }
+
+ @Override
+ protected void loadDefaults(String logFile) {
+ if (StringUtils.hasLength(logFile)) {
+ loadConfiguration(getPackagedConfigFile("log4j-file.properties"), logFile);
+ }
+ else {
+ loadConfiguration(getPackagedConfigFile("log4j.properties"), logFile);
+ }
+ }
+
+ @Override
+ protected void loadConfiguration(String location, String logFile) {
+ Assert.notNull(location, "Location must not be null");
+ if (StringUtils.hasLength(logFile)) {
+ System.setProperty("LOG_FILE", logFile);
+ }
try {
- Log4jConfigurer.initLogging(configLocation);
+ Log4jConfigurer.initLogging(location);
}
catch (Exception ex) {
- throw new IllegalStateException("Could not initialize logging from "
- + configLocation, ex);
+ throw new IllegalStateException("Could not initialize Log4J logging from "
+ + location, ex);
}
}
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java
index 8142f8f8cf..aee678ec09 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java
@@ -24,7 +24,6 @@ import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.springframework.boot.logging.LogLevel;
@@ -32,7 +31,7 @@ import org.springframework.boot.logging.LoggingSystem;
import org.springframework.boot.logging.Slf4JLoggingSystem;
import org.springframework.util.Assert;
import org.springframework.util.ResourceUtils;
-import org.springframework.util.SystemPropertyUtils;
+import org.springframework.util.StringUtils;
/**
* {@link LoggingSystem} for Log4j 2.
@@ -57,44 +56,53 @@ public class Log4J2LoggingSystem extends Slf4JLoggingSystem {
}
public Log4J2LoggingSystem(ClassLoader classLoader) {
- this(classLoader, false, true);
+ super(classLoader);
}
-
- public Log4J2LoggingSystem(ClassLoader classLoader, boolean fileOutput, boolean consoleOutput) {
- super(classLoader, fileOutput, consoleOutput);
- }
-
+
@Override
- protected String[] getLogFileNames() {
+ protected String[] getStandardConfigLocations() {
return new String[] { "log4j2.json", "log4j2.jsn", "log4j2.xml" };
}
@Override
- public void initialize(String configLocation) {
- Assert.notNull(configLocation, "ConfigLocation must not be null");
- String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(configLocation);
- try {
- initializeAndStart(resolvedLocation);
+ public void beforeInitialize() {
+ super.beforeInitialize();
+ setLogLevel("", LogLevel.FATAL);
+ }
+
+ @Override
+ protected void loadDefaults(String logFile) {
+ if (StringUtils.hasLength(logFile)) {
+ loadConfiguration(getPackagedConfigFile("log4j2-file.xml"), logFile);
}
- catch (Exception ex) {
- throw new IllegalStateException("Could not initialize logging from "
- + configLocation, ex);
+ else {
+ loadConfiguration(getPackagedConfigFile("log4j2.xml"), logFile);
}
}
- private void initializeAndStart(String resolvedLocation) throws Exception {
- LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
- URL url = ResourceUtils.getURL(resolvedLocation);
- ConfigurationSource configSource = new ConfigurationSource(url.openStream(), url);
- Configuration config = ConfigurationFactory.getInstance().getConfiguration(
- configSource);
- ctx.start(config);
+ @Override
+ protected void loadConfiguration(String location, String logFile) {
+ Assert.notNull(location, "Location must not be null");
+ if (StringUtils.hasLength(logFile)) {
+ System.setProperty("LOG_FILE", logFile);
+ }
+ try {
+ LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
+ URL url = ResourceUtils.getURL(location);
+ ConfigurationSource source = new ConfigurationSource(url.openStream(), url);
+ ctx.start(ConfigurationFactory.getInstance().getConfiguration(source));
+ }
+ catch (Exception ex) {
+ throw new IllegalStateException("Could not initialize Log4J2 logging from "
+ + location, ex);
+ }
}
@Override
public void setLogLevel(String loggerName, LogLevel level) {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
- ctx.getConfiguration().getLoggerConfig(loggerName).setLevel(LEVELS.get(level));
+ ctx.getConfiguration().getLoggerConfig(loggerName == null ? "" : loggerName)
+ .setLevel(LEVELS.get(level));
ctx.updateLoggers();
}
diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java
index a0daefef40..fc48dec557 100644
--- a/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java
+++ b/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java
@@ -23,6 +23,7 @@ import java.util.Map;
import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
+import org.slf4j.Marker;
import org.slf4j.impl.StaticLoggerBinder;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingSystem;
@@ -30,11 +31,12 @@ import org.springframework.boot.logging.Slf4JLoggingSystem;
import org.springframework.util.Assert;
import org.springframework.util.ResourceUtils;
import org.springframework.util.StringUtils;
-import org.springframework.util.SystemPropertyUtils;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.classic.util.ContextInitializer;
+import ch.qos.logback.core.spi.FilterReply;
/**
* {@link LoggingSystem} for for logback.
@@ -58,25 +60,54 @@ public class LogbackLoggingSystem extends Slf4JLoggingSystem {
LEVELS = Collections.unmodifiableMap(levels);
}
+ private static final TurboFilter FILTER = new TurboFilter() {
+
+ @Override
+ public FilterReply decide(Marker marker, ch.qos.logback.classic.Logger logger,
+ Level level, String format, Object[] params, Throwable t) {
+ return FilterReply.DENY;
+ }
+
+ };
+
public LogbackLoggingSystem(ClassLoader classLoader) {
- this(classLoader, false, true);
- }
-
- public LogbackLoggingSystem(ClassLoader classLoader, boolean fileOutput,
- boolean consoleOutput) {
- super(classLoader, fileOutput, consoleOutput);
+ super(classLoader);
}
@Override
- protected String[] getLogFileNames() {
+ protected String[] getStandardConfigLocations() {
return new String[] { "logback-test.groovy", "logback-test.xml",
"logback.groovy", "logback.xml" };
}
@Override
- public void initialize(String configLocation) {
- Assert.notNull(configLocation, "ConfigLocation must not be null");
- String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(configLocation);
+ public void beforeInitialize() {
+ super.beforeInitialize();
+ getLogger(null).getLoggerContext().getTurboFilterList().add(FILTER);
+ }
+
+ @Override
+ public void initialize(String configLocation, String logFile) {
+ getLogger(null).getLoggerContext().getTurboFilterList().remove(FILTER);
+ super.initialize(configLocation, logFile);
+ }
+
+ @Override
+ protected void loadDefaults(String logFile) {
+ if (StringUtils.hasLength(logFile)) {
+ loadConfiguration(getPackagedConfigFile("logback-file.xml"), logFile);
+ }
+ else {
+ loadConfiguration(getPackagedConfigFile("logback.xml"), logFile);
+ }
+ }
+
+ @Override
+ protected void loadConfiguration(String location, String logFile) {
+ Assert.notNull(location, "Location must not be null");
+ if (StringUtils.hasLength(logFile)) {
+ System.setProperty("LOG_FILE", logFile);
+ }
ILoggerFactory factory = StaticLoggerBinder.getSingleton().getLoggerFactory();
Assert.isInstanceOf(
LoggerContext.class,
@@ -92,22 +123,25 @@ public class LogbackLoggingSystem extends Slf4JLoggingSystem {
context.stop();
context.reset();
try {
- URL url = ResourceUtils.getURL(resolvedLocation);
+ URL url = ResourceUtils.getURL(location);
new ContextInitializer(context).configureByResource(url);
}
catch (Exception ex) {
- throw new IllegalStateException("Could not initialize logging from "
- + configLocation, ex);
+ throw new IllegalStateException("Could not initialize Logback logging from "
+ + location, ex);
}
}
@Override
public void setLogLevel(String loggerName, LogLevel level) {
+ getLogger(loggerName).setLevel(LEVELS.get(level));
+ }
+
+ private ch.qos.logback.classic.Logger getLogger(String name) {
ILoggerFactory factory = StaticLoggerBinder.getSingleton().getLoggerFactory();
- Logger logger = factory
- .getLogger(StringUtils.isEmpty(loggerName) ? Logger.ROOT_LOGGER_NAME
- : loggerName);
- ((ch.qos.logback.classic.Logger) logger).setLevel(LEVELS.get(level));
+ return (ch.qos.logback.classic.Logger) factory.getLogger(StringUtils
+ .isEmpty(name) ? Logger.ROOT_LOGGER_NAME : name);
+
}
}
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/java/basic-logging.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/java/basic-logging.properties
deleted file mode 100644
index 73c81a46ed..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/java/basic-logging.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-handlers = java.util.logging.ConsoleHandler
-.level = INFO
-
-java.util.logging.ConsoleHandler.formatter = org.springframework.boot.logging.java.SimpleFormatter
-java.util.logging.ConsoleHandler.level = ALL
-
-org.hibernate.validator.internal.util.Version.level = WARNING
-org.apache.coyote.http11.Http11NioProtocol.level = WARNING
-org.crsh.plugin.level = WARNING
-org.apache.tomcat.util.net.NioSelectorPool.level = WARNING
-org.apache.catalina.startup.DigesterFactory.level = SEVERE
-org.apache.catalina.util.LifecycleBase.level = SEVERE
-org.eclipse.jetty.util.component.AbstractLifeCycle.level = SEVERE
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file-console.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file-console.properties
deleted file mode 100644
index 0316feebab..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file-console.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-handlers =java.util.logging.FileHandler,java.util.logging.ConsoleHandler
-.level = INFO
-
-# File Logging
-java.util.logging.FileHandler.pattern = %t/spring.log
-java.util.logging.FileHandler.formatter = org.springframework.boot.logging.java.SimpleFormatter
-java.util.logging.FileHandler.level = ALL
-java.util.logging.FileHandler.limit = 10485760
-java.util.logging.FileHandler.count = 10
-
-java.util.logging.ConsoleHandler.formatter = org.springframework.boot.logging.java.SimpleFormatter
-java.util.logging.ConsoleHandler.level = ALL
-
-org.hibernate.validator.internal.util.Version.level = WARNING
-org.apache.coyote.http11.Http11NioProtocol.level = WARNING
-org.crsh.plugin.level = WARNING
-org.apache.tomcat.util.net.NioSelectorPool.level = WARNING
-org.apache.catalina.startup.DigesterFactory.level = SEVERE
-org.apache.catalina.util.LifecycleBase.level = SEVERE
-org.eclipse.jetty.util.component.AbstractLifeCycle.level = SEVERE
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties
index 314d49eaf3..f37a4a153d 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties
@@ -1,13 +1,16 @@
-handlers =java.util.logging.FileHandler
+handlers =java.util.logging.FileHandler,java.util.logging.ConsoleHandler
.level = INFO
# File Logging
-java.util.logging.FileHandler.pattern = %t/spring.log
+java.util.logging.FileHandler.pattern = ${LOG_FILE}
java.util.logging.FileHandler.formatter = org.springframework.boot.logging.java.SimpleFormatter
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.limit = 10485760
java.util.logging.FileHandler.count = 10
+java.util.logging.ConsoleHandler.formatter = org.springframework.boot.logging.java.SimpleFormatter
+java.util.logging.ConsoleHandler.level = ALL
+
org.hibernate.validator.internal.util.Version.level = WARNING
org.apache.coyote.http11.Http11NioProtocol.level = WARNING
org.crsh.plugin.level = WARNING
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-none.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-none.properties
deleted file mode 100644
index fa027f53ab..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-none.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-handlers =
-.level = INFO
-
-org.hibernate.validator.internal.util.Version.level = WARNING
-org.apache.coyote.http11.Http11NioProtocol.level = WARNING
-org.crsh.plugin.level = WARNING
-org.apache.tomcat.util.net.NioSelectorPool.level = WARNING
-org.apache.catalina.startup.DigesterFactory.level = SEVERE
-org.apache.catalina.util.LifecycleBase.level = SEVERE
-org.eclipse.jetty.util.component.AbstractLifeCycle.level = SEVERE
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/basic-log4j.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/basic-log4j.properties
deleted file mode 100644
index 28b637638f..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/basic-log4j.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-log4j.rootCategory=INFO, CONSOLE
-
-PID=????
-LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${PID} %5p [%t] --- %c{1}: %m%n
-
-# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-log4j.appender.CONSOLE.layout.ConversionPattern=${LOG_PATTERN}
-
-log4j.category.org.hibernate.validator.internal.util.Version=WARN
-log4j.category.org.apache.coyote.http11.Http11NioProtocol=WARN
-log4j.category.org.crsh.plugin=WARN
-log4j.category.org.apache.tomcat.util.net.NioSelectorPool=WARN
-log4j.category.org.apache.catalina.startup.DigesterFactory=ERROR
-log4j.category.org.apache.catalina.util.LifecycleBase=ERROR
-log4j.category.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-file-console.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-file-console.properties
deleted file mode 100644
index 58baefaced..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-file-console.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-log4j.rootCategory=INFO, CONSOLE, FILE
-
-PID=????
-LOG_PATH=${java.io.tmpdir}
-LOG_FILE=${LOG_PATH}/spring.log
-LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${PID} %5p [%t] --- %c{1}: %m%n
-
-# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-log4j.appender.CONSOLE.layout.ConversionPattern=${LOG_PATTERN}
-
-log4j.appender.FILE=org.apache.log4j.RollingFileAppender
-log4j.appender.FILE.File=${LOG_FILE}
-log4j.appender.FILE.MaxFileSize=10MB
-log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
-log4j.appender.FILE.layout.ConversionPattern=${LOG_PATTERN}
-
-log4j.category.org.hibernate.validator.internal.util.Version=WARN
-log4j.category.org.apache.coyote.http11.Http11NioProtocol=WARN
-log4j.category.org.crsh.plugin=WARN
-log4j.category.org.apache.tomcat.util.net.NioSelectorPool=WARN
-log4j.category.org.apache.catalina.startup.DigesterFactory=ERROR
-log4j.category.org.apache.catalina.util.LifecycleBase=ERROR
-log4j.category.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-file.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-file.properties
index 949ec6de23..ca1f0ec327 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-file.properties
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-file.properties
@@ -1,20 +1,31 @@
-log4j.rootCategory=INFO,FILE
+log4j.rootCategory=INFO, CONSOLE, FILE
PID=????
LOG_PATH=${java.io.tmpdir}
LOG_FILE=${LOG_PATH}/spring.log
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${PID} %5p [%t] --- %c{1}: %m%n
+# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.CONSOLE.layout.ConversionPattern=${LOG_PATTERN}
+
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=${LOG_FILE}
log4j.appender.FILE.MaxFileSize=10MB
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=${LOG_PATTERN}
-log4j.category.org.hibernate.validator.internal.util.Version=WARN
-log4j.category.org.apache.coyote.http11.Http11NioProtocol=WARN
-log4j.category.org.crsh.plugin=WARN
-log4j.category.org.apache.tomcat.util.net.NioSelectorPool=WARN
log4j.category.org.apache.catalina.startup.DigesterFactory=ERROR
log4j.category.org.apache.catalina.util.LifecycleBase=ERROR
+log4j.category.org.apache.coyote.http11.Http11NioProtocol=WARN
+log4j.category.org.apache.sshd.common.util.SecurityUtils
+log4j.category.org.apache.tomcat.util.net.NioSelectorPool=WARN
+log4j.category.org.crsh.plugin=WARN
+log4j.category.org.crsh.ssh=WARN
log4j.category.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
+log4j.category.org.hibernate.validator.internal.util.Version=WARN
+log4j.category.org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration=WARN
+log4j.category.org.springframework.boot.actuate.endpoint.jmx=WARN
+log4j.category.org.thymeleaf=WARN
+
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-none.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-none.properties
deleted file mode 100644
index f8a630ca8d..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j-none.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-log4j.rootCategory=INFO
-
-PID=????
-LOG_PATH=${java.io.tmpdir}
-LOG_FILE=${LOG_PATH}/spring.log
-LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${PID} %5p [%t] --- %c{1}: %m%n
-
-
-log4j.category.org.hibernate.validator.internal.util.Version=WARN
-log4j.category.org.apache.coyote.http11.Http11NioProtocol=WARN
-log4j.category.org.crsh.plugin=WARN
-log4j.category.org.apache.tomcat.util.net.NioSelectorPool=WARN
-log4j.category.org.apache.catalina.startup.DigesterFactory=ERROR
-log4j.category.org.apache.catalina.util.LifecycleBase=ERROR
-log4j.category.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j.properties b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j.properties
index e0885761df..4b4d9f291e 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j.properties
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j/log4j.properties
@@ -1,8 +1,6 @@
log4j.rootCategory=INFO, CONSOLE
PID=????
-LOG_PATH=${java.io.tmpdir}
-LOG_FILE=${LOG_PATH}/spring.log
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${PID} %5p [%t] --- %c{1}: %m%n
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
@@ -10,11 +8,15 @@ log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=${LOG_PATTERN}
-
-log4j.category.org.hibernate.validator.internal.util.Version=WARN
-log4j.category.org.apache.coyote.http11.Http11NioProtocol=WARN
-log4j.category.org.crsh.plugin=WARN
-log4j.category.org.apache.tomcat.util.net.NioSelectorPool=WARN
log4j.category.org.apache.catalina.startup.DigesterFactory=ERROR
log4j.category.org.apache.catalina.util.LifecycleBase=ERROR
+log4j.category.org.apache.coyote.http11.Http11NioProtocol=WARN
+log4j.category.org.apache.sshd.common.util.SecurityUtils
+log4j.category.org.apache.tomcat.util.net.NioSelectorPool=WARN
+log4j.category.org.crsh.plugin=WARN
+log4j.category.org.crsh.ssh=WARN
log4j.category.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
+log4j.category.org.hibernate.validator.internal.util.Version=WARN
+log4j.category.org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration=WARN
+log4j.category.org.springframework.boot.actuate.endpoint.jmx=WARN
+log4j.category.org.thymeleaf=WARN
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/basic-log4j2.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/basic-log4j2.xml
deleted file mode 100644
index d8e113eac3..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/basic-log4j2.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- ????
- [%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file-console.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file-console.xml
deleted file mode 100644
index e2f1bb78a7..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file-console.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
- ????
- /tmp
- ${sys:LOG_PATH}/spring.log
- [%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
-
-
-
-
-
-
-
- ${LOG_PATTERN}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file.xml
index b1bc0235c0..9171b146c2 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file.xml
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-file.xml
@@ -1,33 +1,38 @@
-
- ????
- /tmp
- ${sys:LOG_PATH}/spring.log
- [%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
-
-
-
-
- ${LOG_PATTERN}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ ????
+ [%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
+
+
+
+
+
+
+
+ ${LOG_PATTERN}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-none.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-none.xml
deleted file mode 100644
index eed5a2c784..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2-none.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- ????
- /tmp
- ${sys:LOG_PATH}/spring.log
- [%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2.xml
index 2374d828ef..45e09bc402 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2.xml
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2.xml
@@ -1,27 +1,29 @@
-
- ????
- /tmp
- ${sys:LOG_PATH}/spring.log
- [%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ ????
+ [%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base.xml
index dc572d9583..71d33621a6 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base.xml
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base.xml
@@ -2,16 +2,28 @@
-
+
-
-
- ${CONSOLE_LOG_PATTERN}
- utf8
-
+
+
+
+ org.springframework.boot
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/basic-logback.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/basic-logback.xml
deleted file mode 100644
index a5c5515b84..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/basic-logback.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/console-appender.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/console-appender.xml
new file mode 100644
index 0000000000..a08abd194d
--- /dev/null
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/console-appender.xml
@@ -0,0 +1,9 @@
+
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+ utf8
+
+
+
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base-file.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/file-appender.xml
similarity index 55%
rename from spring-boot/src/main/resources/org/springframework/boot/logging/logback/base-file.xml
rename to spring-boot/src/main/resources/org/springframework/boot/logging/logback/file-appender.xml
index a7ed15fc0d..f6dd783564 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/base-file.xml
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/file-appender.xml
@@ -1,8 +1,5 @@
-
-
-
@@ -17,7 +14,4 @@
10MB
-
-
-
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-file-console.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-file-console.xml
deleted file mode 100644
index 38e7fe99c4..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-file-console.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-file.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-file.xml
index 6d0ccd3537..0d5c8a3c42 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-file.xml
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-file.xml
@@ -1,4 +1,12 @@
-
+
+
+
+
+
+
+
+
+
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-none.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-none.xml
deleted file mode 100644
index eb91e909b9..0000000000
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback-none.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback.xml b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback.xml
index b8a41480d7..5b372d2331 100644
--- a/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback.xml
+++ b/spring-boot/src/main/resources/org/springframework/boot/logging/logback/logback.xml
@@ -1,4 +1,8 @@
+
+
+
+
diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/AbstractLoggingSystemTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/AbstractLoggingSystemTests.java
new file mode 100644
index 0000000000..81457f7c26
--- /dev/null
+++ b/spring-boot/src/test/java/org/springframework/boot/logging/AbstractLoggingSystemTests.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012-2014 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.springframework.boot.logging;
+
+import java.io.File;
+
+import org.junit.After;
+import org.junit.Before;
+import org.springframework.util.StringUtils;
+
+/**
+ * Base for {@link LoggingSystem} tests.
+ *
+ * @author Phillip Webb
+ */
+public abstract class AbstractLoggingSystemTests {
+
+ @Before
+ public void deleteTempLog() {
+ new File(tmpDir() + "/spring.log").delete();
+ }
+
+ @After
+ public void clear() {
+ System.clearProperty("LOG_FILE");
+ System.clearProperty("PID");
+ }
+
+ protected final String tmpDir() {
+ String path = StringUtils.cleanPath(System.getProperty("java.io.tmpdir"));
+ if (path.endsWith("/")) {
+ path = path.substring(0, path.length() - 1);
+ }
+ return path;
+ }
+
+}
diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java
index a0d9de3ae0..077cd1dab1 100644
--- a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java
+++ b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java
@@ -106,17 +106,6 @@ public class LoggingApplicationListenerTests {
assertFalse(new File(tmpDir() + "/spring.log").exists());
}
- @Test
- public void noConsole() {
- EnvironmentTestUtils.addEnvironment(this.context, "logging.console: false");
- this.initializer.initialize(this.context.getEnvironment(),
- this.context.getClassLoader());
- this.logger.info("Hello world");
- String output = this.outputCapture.toString().trim();
- assertFalse("Wrong output:\n" + output, output.contains("Hello world"));
- assertFalse(new File(tmpDir() + "/spring.log").exists());
- }
-
@Test
public void overrideConfigLocation() {
EnvironmentTestUtils.addEnvironment(this.context,
@@ -127,7 +116,8 @@ public class LoggingApplicationListenerTests {
String output = this.outputCapture.toString().trim();
assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
assertFalse("Wrong output:\n" + output, output.contains("???"));
- assertTrue("Wrong output:\n" + output, output.startsWith(tmpDir() + "/tmp.log"));
+ assertTrue("Wrong output:\n" + output, output.startsWith("LOG_FILE_IS_UNDEFINED"));
+ assertTrue("Wrong output:\n" + output, output.endsWith("BOOTBOOT"));
}
@Test
@@ -178,7 +168,7 @@ public class LoggingApplicationListenerTests {
Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class);
logger.info("Hello world");
String output = this.outputCapture.toString().trim();
- assertTrue("Wrong output:\n" + output, output.startsWith("target/foo/tmp.log"));
+ assertTrue("Wrong output:\n" + output, output.startsWith("target/foo/spring.log"));
}
@Test
diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggerSystemTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggerSystemTests.java
index 8c3f9ff617..5645112bd3 100644
--- a/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggerSystemTests.java
+++ b/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggerSystemTests.java
@@ -16,6 +16,8 @@
package org.springframework.boot.logging.java;
+import java.io.File;
+import java.io.FileFilter;
import java.io.IOException;
import java.util.Locale;
@@ -24,12 +26,15 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.springframework.boot.logging.AbstractLoggingSystemTests;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.test.OutputCapture;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -37,8 +42,18 @@ import static org.junit.Assert.assertTrue;
* Tests for {@link JavaLoggingSystem}.
*
* @author Dave Syer
+ * @author Phillip Webb
*/
-public class JavaLoggerSystemTests {
+public class JavaLoggerSystemTests extends AbstractLoggingSystemTests {
+
+ private static final FileFilter SPRING_LOG_FILTER = new FileFilter() {
+
+ @Override
+ public boolean accept(File pathname) {
+ return pathname.getName().startsWith("spring.log");
+ }
+
+ };
private final JavaLoggingSystem loggingSystem = new JavaLoggingSystem(getClass()
.getClassLoader());
@@ -58,17 +73,43 @@ public class JavaLoggerSystemTests {
}
@After
- public void clear() {
- System.clearProperty("LOG_FILE");
- System.clearProperty("LOG_PATH");
- System.clearProperty("PID");
+ public void clearLocale() {
Locale.setDefault(this.defaultLocale);
}
+ @Test
+ public void noFile() throws Exception {
+ this.loggingSystem.beforeInitialize();
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, null);
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertFalse(new File(tmpDir() + "/spring.log").exists());
+ }
+
+ @Test
+ public void withFile() throws Exception {
+ File temp = new File(tmpDir());
+ File[] logFiles = temp.listFiles(SPRING_LOG_FILTER);
+ for (File file : logFiles) {
+ file.delete();
+ }
+ this.loggingSystem.beforeInitialize();
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, tmpDir() + "/spring.log");
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertThat(temp.listFiles(SPRING_LOG_FILTER).length, greaterThan(0));
+ }
+
@Test
public void testCustomFormatter() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
this.logger.info("Hello world");
String output = this.output.toString().trim();
assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
@@ -79,9 +120,10 @@ public class JavaLoggerSystemTests {
public void testSystemPropertyInitializesFormat() throws Exception {
System.setProperty("PID", "1234");
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:"
- + ClassUtils.addResourcePathToPackagePath(getClass(),
- "logging.properties"));
+ this.loggingSystem.initialize(
+ "classpath:"
+ + ClassUtils.addResourcePathToPackagePath(getClass(),
+ "logging.properties"), null);
this.logger.info("Hello world");
this.logger.info("Hello world");
String output = this.output.toString().trim();
@@ -92,7 +134,7 @@ public class JavaLoggerSystemTests {
@Test
public void testNonDefaultConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:logging-nondefault.properties");
+ this.loggingSystem.initialize("classpath:logging-nondefault.properties", null);
this.logger.info("Hello world");
String output = this.output.toString().trim();
assertTrue("Wrong output:\n" + output, output.contains("INFO: Hello"));
@@ -101,19 +143,13 @@ public class JavaLoggerSystemTests {
@Test(expected = IllegalStateException.class)
public void testNonexistentConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:logging-nonexistent.properties");
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testNullConfigLocation() throws Exception {
- this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize(null);
+ this.loggingSystem.initialize("classpath:logging-nonexistent.properties", null);
}
@Test
public void setLevel() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
this.logger.debug("Hello");
this.loggingSystem.setLogLevel("org.springframework.boot", LogLevel.DEBUG);
this.logger.debug("Hello");
diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/log4j/Log4JLoggingSystemTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/log4j/Log4JLoggingSystemTests.java
index b5cebfec9a..f700dd4274 100644
--- a/spring-boot/src/test/java/org/springframework/boot/logging/log4j/Log4JLoggingSystemTests.java
+++ b/spring-boot/src/test/java/org/springframework/boot/logging/log4j/Log4JLoggingSystemTests.java
@@ -16,17 +16,20 @@
package org.springframework.boot.logging.log4j;
+import java.io.File;
+
import org.apache.commons.logging.impl.Log4JLogger;
-import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
+import org.springframework.boot.logging.AbstractLoggingSystemTests;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.test.OutputCapture;
import org.springframework.util.StringUtils;
import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -35,7 +38,7 @@ import static org.junit.Assert.assertTrue;
*
* @author Phillip Webb
*/
-public class Log4JLoggingSystemTests {
+public class Log4JLoggingSystemTests extends AbstractLoggingSystemTests {
@Rule
public OutputCapture output = new OutputCapture();
@@ -50,39 +53,52 @@ public class Log4JLoggingSystemTests {
this.logger = new Log4JLogger(getClass().getName());
}
- @After
- public void clear() {
- System.clearProperty("LOG_FILE");
- System.clearProperty("LOG_PATH");
- System.clearProperty("PID");
+ @Test
+ public void noFile() throws Exception {
+ this.loggingSystem.beforeInitialize();
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, null);
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertFalse(new File(tmpDir() + "/spring.log").exists());
}
@Test
- public void testNonDefaultConfigLocation() throws Exception {
+ public void withFile() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:log4j-nondefault.properties");
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, tmpDir() + "/spring.log");
this.logger.info("Hello world");
String output = this.output.toString().trim();
assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
- assertTrue("Wrong output:\n" + output, output.contains("/tmp/spring.log"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertTrue(new File(tmpDir() + "/spring.log").exists());
}
- @Test(expected = IllegalStateException.class)
- public void testNonexistentConfigLocation() throws Exception {
+ @Test
+ public void testNonDefaultConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:log4j-nonexistent.xml");
+ this.loggingSystem.initialize("classpath:log4j-nondefault.properties", tmpDir()
+ + "/spring.log");
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertTrue("Wrong output:\n" + output, output.contains(tmpDir() + "/spring.log"));
+ assertFalse(new File(tmpDir() + "/tmp.log").exists());
}
- @Test(expected = IllegalArgumentException.class)
- public void testNullConfigLocation() throws Exception {
+ @Test(expected = IllegalStateException.class)
+ public void testNonexistentConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize(null);
+ this.loggingSystem.initialize("classpath:log4j-nonexistent.xml", null);
}
@Test
public void setLevel() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
this.logger.debug("Hello");
this.loggingSystem.setLogLevel("org.springframework.boot", LogLevel.DEBUG);
this.logger.debug("Hello");
@@ -94,7 +110,7 @@ public class Log4JLoggingSystemTests {
@Ignore("Fails on Bamboo")
public void loggingThatUsesJulIsCaptured() {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
java.util.logging.Logger julLogger = java.util.logging.Logger
.getLogger(getClass().getName());
julLogger.severe("Hello world");
diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java
index b08aa01143..bf9305b1e9 100644
--- a/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java
+++ b/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java
@@ -16,18 +16,21 @@
package org.springframework.boot.logging.log4j2;
+import java.io.File;
+
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
+import org.springframework.boot.logging.AbstractLoggingSystemTests;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.test.OutputCapture;
import org.springframework.util.StringUtils;
import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -35,8 +38,9 @@ import static org.junit.Assert.assertTrue;
* Tests for {@link Log4J2LoggingSystem}.
*
* @author Daniel Fullarton
+ * @author Phillip Webb
*/
-public class Log4J2LoggingSystemTests {
+public class Log4J2LoggingSystemTests extends AbstractLoggingSystemTests {
@Rule
public OutputCapture output = new OutputCapture();
@@ -51,39 +55,52 @@ public class Log4J2LoggingSystemTests {
this.logger = LogManager.getLogger(getClass());
}
- @After
- public void clear() {
- System.clearProperty("LOG_FILE");
- System.clearProperty("LOG_PATH");
- System.clearProperty("PID");
+ @Test
+ public void noFile() throws Exception {
+ this.loggingSystem.beforeInitialize();
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, null);
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertFalse(new File(tmpDir() + "/spring.log").exists());
}
@Test
- public void testNonDefaultConfigLocation() throws Exception {
+ public void withFile() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:log4j2-nondefault.xml");
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, tmpDir() + "/spring.log");
this.logger.info("Hello world");
String output = this.output.toString().trim();
assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
- assertTrue("Wrong output:\n" + output, output.contains("/tmp/spring.log"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertTrue(new File(tmpDir() + "/spring.log").exists());
}
- @Test(expected = IllegalStateException.class)
- public void testNonexistentConfigLocation() throws Exception {
+ @Test
+ public void testNonDefaultConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:log4j2-nonexistent.xml");
+ this.loggingSystem.initialize("classpath:log4j2-nondefault.xml", tmpDir()
+ + "/tmp.log");
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertTrue("Wrong output:\n" + output, output.contains(tmpDir() + "/tmp.log"));
+ assertFalse(new File(tmpDir() + "/tmp.log").exists());
}
- @Test(expected = IllegalArgumentException.class)
- public void testNullConfigLocation() throws Exception {
+ @Test(expected = IllegalStateException.class)
+ public void testNonexistentConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize(null);
+ this.loggingSystem.initialize("classpath:log4j2-nonexistent.xml", null);
}
@Test
public void setLevel() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
this.logger.debug("Hello");
this.loggingSystem.setLogLevel("org.springframework.boot", LogLevel.DEBUG);
this.logger.debug("Hello");
@@ -95,7 +112,7 @@ public class Log4J2LoggingSystemTests {
@Ignore("Fails on Bamboo")
public void loggingThatUsesJulIsCaptured() {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
java.util.logging.Logger julLogger = java.util.logging.Logger
.getLogger(getClass().getName());
julLogger.severe("Hello world");
diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java
index e752491c17..e0eb506388 100644
--- a/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java
+++ b/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java
@@ -20,12 +20,12 @@ import java.io.File;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.SLF4JLogFactory;
-import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.ILoggerFactory;
import org.slf4j.impl.StaticLoggerBinder;
+import org.springframework.boot.logging.AbstractLoggingSystemTests;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.test.OutputCapture;
import org.springframework.util.StringUtils;
@@ -43,8 +43,9 @@ import static org.junit.Assert.assertTrue;
* Tests for {@link LogbackLoggingSystem}.
*
* @author Dave Syer
+ * @author Phillip Webb
*/
-public class LogbackLoggingSystemTests {
+public class LogbackLoggingSystemTests extends AbstractLoggingSystemTests {
@Rule
public OutputCapture output = new OutputCapture();
@@ -57,22 +58,30 @@ public class LogbackLoggingSystemTests {
@Before
public void setup() {
this.logger = new SLF4JLogFactory().getInstance(getClass().getName());
- new File(tmpDir() + "/spring.log").delete();
}
- private String tmpDir() {
- String path = StringUtils.cleanPath(System.getProperty("java.io.tmpdir"));
- if (path.endsWith("/")) {
- path = path.substring(0, path.length() - 1);
- }
- return path;
+ @Test
+ public void noFile() throws Exception {
+ this.loggingSystem.beforeInitialize();
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, null);
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertFalse(new File(tmpDir() + "/spring.log").exists());
}
- @After
- public void clear() {
- System.clearProperty("LOG_FILE");
- System.clearProperty("LOG_PATH");
- System.clearProperty("PID");
+ @Test
+ public void withFile() throws Exception {
+ this.loggingSystem.beforeInitialize();
+ this.logger.info("Hidden");
+ this.loggingSystem.initialize(null, tmpDir() + "/spring.log");
+ this.logger.info("Hello world");
+ String output = this.output.toString().trim();
+ assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
+ assertFalse("Output not hidden:\n" + output, output.contains("Hidden"));
+ assertTrue(new File(tmpDir() + "/spring.log").exists());
}
@Test
@@ -87,31 +96,26 @@ public class LogbackLoggingSystemTests {
@Test
public void testNonDefaultConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:logback-nondefault.xml");
+ this.loggingSystem.initialize("classpath:logback-nondefault.xml", tmpDir()
+ + "/tmp.log");
this.logger.info("Hello world");
String output = this.output.toString().trim();
assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
- assertTrue("Wrong output (not " + tmpDir() + " :\n" + output,
- output.contains(tmpDir() + "/tmp.log"));
+ assertTrue("Wrong output:\n" + output, output.contains(tmpDir() + "/tmp.log"));
+ assertTrue("Wrong output:\n" + output, output.endsWith("BOOTBOOT"));
assertFalse(new File(tmpDir() + "/tmp.log").exists());
}
@Test(expected = IllegalStateException.class)
public void testNonexistentConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize("classpath:logback-nonexistent.xml");
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testNullConfigLocation() throws Exception {
- this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize(null);
+ this.loggingSystem.initialize("classpath:logback-nonexistent.xml", null);
}
@Test
public void setLevel() throws Exception {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
this.logger.debug("Hello");
this.loggingSystem.setLogLevel("org.springframework.boot", LogLevel.DEBUG);
this.logger.debug("Hello");
@@ -122,7 +126,7 @@ public class LogbackLoggingSystemTests {
@Test
public void loggingThatUsesJulIsCaptured() {
this.loggingSystem.beforeInitialize();
- this.loggingSystem.initialize();
+ this.loggingSystem.initialize(null, null);
java.util.logging.Logger julLogger = java.util.logging.Logger
.getLogger(getClass().getName());
julLogger.info("Hello world");
diff --git a/spring-boot/src/test/resources/log4j-nondefault.properties b/spring-boot/src/test/resources/log4j-nondefault.properties
index 544139af91..d852ca65d8 100644
--- a/spring-boot/src/test/resources/log4j-nondefault.properties
+++ b/spring-boot/src/test/resources/log4j-nondefault.properties
@@ -2,8 +2,6 @@ log4j.reset=true
log4j.rootCategory=INFO, CONSOLE
PID=????
-LOG_PATH=/tmp
-LOG_FILE=${LOG_PATH}/spring.log
LOG_PATTERN=${LOG_FILE} %d{yyyy-MM-dd HH:mm:ss.SSS}] service%X{context} - ${PID} %5p [%t] --- %c{1}: %m%n
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
diff --git a/spring-boot/src/test/resources/log4j2-nondefault.xml b/spring-boot/src/test/resources/log4j2-nondefault.xml
index 53bf99dd3c..9ab4cd276b 100644
--- a/spring-boot/src/test/resources/log4j2-nondefault.xml
+++ b/spring-boot/src/test/resources/log4j2-nondefault.xml
@@ -1,19 +1,17 @@
-
- ????
- /tmp
- ${sys:LOG_PATH}/spring.log
- ${sys:LOG_FILE} %d{yyyy-MM-dd HH:mm:ss.SSS}] service%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+ ????
+ ${sys:LOG_FILE} %d{yyyy-MM-dd HH:mm:ss.SSS}] service%X{context} - ${sys:PID} %5p [%t] --- %c{1}: %m%n
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-boot/src/test/resources/logback-nondefault.xml b/spring-boot/src/test/resources/logback-nondefault.xml
index 5044712267..4224068672 100644
--- a/spring-boot/src/test/resources/logback-nondefault.xml
+++ b/spring-boot/src/test/resources/logback-nondefault.xml
@@ -1,9 +1,8 @@
-
- ${LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n
+ ${LOG_FILE} [%t] ${PID:-????} %c{1}: %m%n BOOTBOOT