Commit bcfd1cc0 authored by Stephane Nicoll's avatar Stephane Nicoll

Merge pull request #4917 from eddumelendez/gh-4905

* pr/4917:
  Polish contribution
  Remove support for Log4j
  Remove deprecated code
parents fbaf2092 4ff5afc6
/*
* Copyright 2013-2015 the original author or authors.
* Copyright 2012-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.
......@@ -32,18 +32,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
@ManagedResource
public class DataEndpointMBean extends EndpointMBean {
/**
* Create a new {@link DataEndpointMBean} instance.
* @param beanName the bean name
* @param endpoint the endpoint to wrap
* @deprecated since 1.3 in favor of
* {@link #DataEndpointMBean(String, Endpoint, ObjectMapper)}
*/
@Deprecated
public DataEndpointMBean(String beanName, Endpoint<?> endpoint) {
super(beanName, endpoint);
}
/**
* Create a new {@link DataEndpointMBean} instance.
* @param beanName the bean name
......
/*
* Copyright 2013-2015 the original author or authors.
* Copyright 2012-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.
......@@ -40,18 +40,6 @@ public class EndpointMBean {
private final ObjectMapper mapper;
/**
* Create a new {@link EndpointMBean} instance.
* @param beanName the bean name
* @param endpoint the endpoint to wrap
* @deprecated since 1.3 in favor of
* {@link #EndpointMBean(String, Endpoint, ObjectMapper)}
*/
@Deprecated
public EndpointMBean(String beanName, Endpoint<?> endpoint) {
this(beanName, endpoint, new ObjectMapper());
}
/**
* Create a new {@link EndpointMBean} instance.
* @param beanName the bean name
......
/*
* Copyright 2013-2015 the original author or authors.
* Copyright 2012-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.
......@@ -32,18 +32,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
@ManagedResource
public class ShutdownEndpointMBean extends EndpointMBean {
/**
* Create a new {@link ShutdownEndpointMBean} instance.
* @param beanName the bean name
* @param endpoint the endpoint to wrap
* @deprecated since 1.3 in favor of
* {@link #ShutdownEndpointMBean(String, Endpoint, ObjectMapper)}
*/
@Deprecated
public ShutdownEndpointMBean(String beanName, Endpoint<?> endpoint) {
super(beanName, endpoint);
}
/**
* Create a new {@link ShutdownEndpointMBean} instance.
* @param beanName the bean name
......
/*
* Copyright 2012-2015 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.actuate.metrics.writer;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.actuate.metrics.dropwizard.DropwizardMetricServices;
/**
* A {@link MetricWriter} that send data to a Dropwizard {@link MetricRegistry} based on a
* naming convention.
*
* <ul>
* <li>Updates to {@link #increment(Delta)} with names in "meter.*" are treated as
* {@link Meter} events</li>
* <li>Other deltas are treated as simple {@link Counter} values</li>
* <li>Inputs to {@link #set(Metric)} with names in "histogram.*" are treated as
* {@link Histogram} updates</li>
* <li>Inputs to {@link #set(Metric)} with names in "timer.*" are treated as {@link Timer}
* updates</li>
* <li>Other metrics are treated as simple {@link Gauge} values (single valued
* measurements of type double)</li>
* </ul>
*
* @author Dave Syer
* @deprecated Since 1.3 in favor of {@link DropwizardMetricServices}
*/
@Deprecated
public class DropwizardMetricWriter implements MetricWriter {
private final MetricRegistry registry;
private final ConcurrentMap<String, Object> gaugeLocks = new ConcurrentHashMap<String, Object>();
/**
* Create a new {@link DropwizardMetricWriter} instance.
* @param registry the underlying metric registry
*/
public DropwizardMetricWriter(MetricRegistry registry) {
this.registry = registry;
}
@Override
public void increment(Delta<?> delta) {
String name = delta.getName();
long value = delta.getValue().longValue();
if (name.startsWith("meter")) {
Meter meter = this.registry.meter(name);
meter.mark(value);
}
else {
Counter counter = this.registry.counter(name);
counter.inc(value);
}
}
@Override
public void set(Metric<?> value) {
String name = value.getName();
if (name.startsWith("histogram")) {
long longValue = value.getValue().longValue();
Histogram metric = this.registry.histogram(name);
metric.update(longValue);
}
else if (name.startsWith("timer")) {
long longValue = value.getValue().longValue();
Timer metric = this.registry.timer(name);
metric.update(longValue, TimeUnit.MILLISECONDS);
}
else {
final double gauge = value.getValue().doubleValue();
// Ensure we synchronize to avoid another thread pre-empting this thread after
// remove causing an error in Dropwizard Metrics
// NOTE: Dropwizard Metrics provides no way to do this atomically
synchronized (getGaugeLock(name)) {
this.registry.remove(name);
this.registry.register(name, new SimpleGauge(gauge));
}
}
}
private Object getGaugeLock(String name) {
Object lock = this.gaugeLocks.get(name);
if (lock == null) {
Object newLock = new Object();
lock = this.gaugeLocks.putIfAbsent(name, newLock);
lock = (lock == null ? newLock : lock);
}
return lock;
}
@Override
public void reset(String metricName) {
this.registry.remove(metricName);
}
/**
* Simple {@link Gauge} implementation to {@literal double} value.
*/
private final static class SimpleGauge implements Gauge<Double> {
private final double value;
private SimpleGauge(double value) {
this.value = value;
}
@Override
public Double getValue() {
return this.value;
}
}
}
......@@ -62,17 +62,6 @@ public class WebRequestTraceFilter extends OncePerRequestFilter implements Order
private final TraceProperties properties;
/**
* Create a new {@link WebRequestTraceFilter} instance.
* @param traceRepository the trace repository.
* @deprecated since 1.3.0 in favor of
* {@link #WebRequestTraceFilter(TraceRepository, TraceProperties)}
*/
@Deprecated
public WebRequestTraceFilter(TraceRepository traceRepository) {
this(traceRepository, new TraceProperties());
}
/**
* Create a new {@link WebRequestTraceFilter} instance.
* @param repository the trace repository
......
......@@ -42,12 +42,4 @@ public @interface ConditionalOnMissingClass {
*/
String[] value() default {};
/**
* An alias for {@link #value} specifying the names of the classes that must not be
* present.
* @return the class names that must not be present.
* @deprecated since 1.3.0 in favor of {@link #value}.
*/
String[] name() default {};
}
/*
* Copyright 2012-2015 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.autoconfigure.groovy.template;
import java.io.IOException;
import java.net.URL;
import groovy.text.markup.MarkupTemplateEngine;
import groovy.text.markup.TemplateConfiguration;
import groovy.text.markup.TemplateResolver;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.servlet.view.groovy.GroovyMarkupConfigurer;
import org.springframework.web.servlet.view.groovy.GroovyMarkupViewResolver;
/**
* A custom {@link groovy.text.markup.TemplateResolver template resolver} which resolves
* templates using the locale found in the thread locale. This resolver ignores the
* template engine configuration locale.
*
* @author Cédric Champeau
* @since 1.1.0
* @deprecated since 1.2 in favor of Spring 4.1's {@link GroovyMarkupViewResolver} and
* {@link GroovyMarkupConfigurer}.
*/
@Deprecated
public class GroovyTemplateResolver implements TemplateResolver {
private ClassLoader templateClassLoader;
@Override
public void configure(final ClassLoader templateClassLoader,
final TemplateConfiguration configuration) {
this.templateClassLoader = templateClassLoader;
}
@Override
public URL resolveTemplate(final String templatePath) throws IOException {
MarkupTemplateEngine.TemplateResource templateResource = MarkupTemplateEngine.TemplateResource
.parse(templatePath);
URL resource = this.templateClassLoader.getResource(templateResource
.withLocale(LocaleContextHolder.getLocale().toString().replace("-", "_"))
.toString());
if (resource == null) {
// no resource found with the default locale, try without any locale
resource = this.templateClassLoader
.getResource(templateResource.withLocale(null).toString());
}
if (resource == null) {
throw new IOException("Unable to load template:" + templatePath);
}
return resource;
}
}
......@@ -181,21 +181,6 @@ public class MongoProperties {
return new MongoClientURI(this.uri).getDatabase();
}
/**
* Creates a {@link MongoClient} using the given {@code options}.
*
* @param options the options
* @return the Mongo client
* @throws UnknownHostException if the configured host is unknown
* @deprecated Since 1.3.0 in favour of
* {@link #createMongoClient(MongoClientOptions, Environment)}
*/
@Deprecated
public MongoClient createMongoClient(MongoClientOptions options)
throws UnknownHostException {
return this.createMongoClient(options, null);
}
/**
* Creates a {@link MongoClient} using the given {@code options} and
* {@code environment}. If the configured port is zero, the value of the
......
/*
* Copyright 2012-2015 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.autoconfigure.orm.jpa;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager;
/**
* Convenient builder for JPA EntityManagerFactory instances. Collects common
* configuration when constructed and then allows you to create one or more
* {@link LocalContainerEntityManagerFactoryBean} through a fluent builder pattern. The
* most common options are covered in the builder, but you can always manipulate the
* product of the builder if you need more control, before returning it from a
* {@code @Bean} definition.
*
* @author Dave Syer
* @since 1.1.0
* @deprecated since 1.3.0 in favor of
* {@link org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder}
*/
@Deprecated
public class EntityManagerFactoryBuilder {
private final Delegate delegate;
/**
* Create a new instance passing in the common pieces that will be shared if multiple
* EntityManagerFactory instances are created.
* @param jpaVendorAdapter a vendor adapter
* @param properties common configuration options, including generic map for JPA
* vendor properties
* @param persistenceUnitManager optional source of persistence unit information (can
* be null)
*/
public EntityManagerFactoryBuilder(JpaVendorAdapter jpaVendorAdapter,
JpaProperties properties, PersistenceUnitManager persistenceUnitManager) {
this.delegate = new Delegate(jpaVendorAdapter, properties.getProperties(),
persistenceUnitManager);
}
public Builder dataSource(DataSource dataSource) {
return new Builder(this.delegate.dataSource(dataSource));
}
/**
* An optional callback for new entity manager factory beans.
* @param callback the entity manager factory bean callback
*/
public void setCallback(final EntityManagerFactoryBeanCallback callback) {
this.delegate.setCallback(
new org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder.EntityManagerFactoryBeanCallback() {
@Override
public void execute(LocalContainerEntityManagerFactoryBean factory) {
callback.execute(factory);
}
});
}
/**
* A fluent builder for a LocalContainerEntityManagerFactoryBean.
* @deprecated since 1.3.0 in favor of
* {@link org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder}
*/
@Deprecated
public final class Builder {
private final org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder.Builder delegate;
private Builder(
org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder.Builder delegate) {
this.delegate = delegate;
}
/**
* The names of packages to scan for {@code @Entity} annotations.
* @param packagesToScan packages to scan
* @return the builder for fluent usage
*/
public Builder packages(String... packagesToScan) {
this.delegate.packages(packagesToScan);
return this;
}
/**
* The classes whose packages should be scanned for {@code @Entity} annotations.
* @param basePackageClasses the classes to use
* @return the builder for fluent usage
*/
public Builder packages(Class<?>... basePackageClasses) {
this.delegate.packages(basePackageClasses);
return this;
}
/**
* The name of the persistence unit. If only building one EntityManagerFactory you
* can omit this, but if there are more than one in the same application you
* should give them distinct names.
* @param persistenceUnit the name of the persistence unit
* @return the builder for fluent usage
*/
public Builder persistenceUnit(String persistenceUnit) {
this.delegate.persistenceUnit(persistenceUnit);
return this;
}
/**
* Generic properties for standard JPA or vendor-specific configuration. These
* properties override any values provided in the {@link JpaProperties} used to
* create the builder.
* @param properties the properties to use
* @return the builder for fluent usage
*/
public Builder properties(Map<String, ?> properties) {
this.delegate.properties(properties);
return this;
}
/**
* Configure if using a JTA {@link DataSource}, i.e. if
* {@link LocalContainerEntityManagerFactoryBean#setDataSource(DataSource)
* setDataSource} or
* {@link LocalContainerEntityManagerFactoryBean#setJtaDataSource(DataSource)
* setJtaDataSource} should be called on the
* {@link LocalContainerEntityManagerFactoryBean}.
* @param jta if the data source is JTA
* @return the builder for fluent usage
*/
public Builder jta(boolean jta) {
this.delegate.jta(jta);
return this;
}
public LocalContainerEntityManagerFactoryBean build() {
return this.delegate.build();
}
}
/**
* A callback for new entity manager factory beans created by a Builder.
* @deprecated since 1.3.0 in favor of
* {@link org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder}
*/
@Deprecated
public interface EntityManagerFactoryBeanCallback {
void execute(LocalContainerEntityManagerFactoryBean factory);
}
private static class Delegate
extends org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder {
Delegate(JpaVendorAdapter jpaVendorAdapter, Map<String, ?> jpaProperties,
PersistenceUnitManager persistenceUnitManager) {
super(jpaVendorAdapter, jpaProperties, persistenceUnitManager);
}
}
}
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -51,17 +51,6 @@ public class BasicErrorController extends AbstractErrorController {
private final ErrorProperties errorProperties;
/**
* Create a new {@link BasicErrorController} instance.
* @param errorAttributes the error attributes
* @deprecated since 1.3.0 in favor of
* {@link #BasicErrorController(ErrorAttributes, ErrorProperties)}
*/
@Deprecated
public BasicErrorController(ErrorAttributes errorAttributes) {
this(errorAttributes, new ErrorProperties());
}
/**
* Create a new {@link BasicErrorController} instance.
* @param errorAttributes the error attributes
......
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -55,7 +55,6 @@ import org.springframework.boot.context.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.Ordered;
......@@ -327,27 +326,6 @@ public class ServerProperties
return (platform == null ? false : platform.isUsingForwardHeaders());
}
/**
* Get the session timeout.
* @return the session timeout
* @deprecated since 1.3.0 in favor of {@code session.timeout}.
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.session.timeout")
public Integer getSessionTimeout() {
return this.session.getTimeout();
}
/**
* Set the session timeout.
* @param sessionTimeout the session timeout
* @deprecated since 1.3.0 in favor of {@code session.timeout}.
*/
@Deprecated
public void setSessionTimeout(Integer sessionTimeout) {
this.session.setTimeout(sessionTimeout);
}
public ErrorProperties getError() {
return this.error;
}
......@@ -632,48 +610,6 @@ public class ServerProperties
return this.accesslog;
}
/**
* Specify if access log is enabled.
* @return {@code true} if access log is enabled
* @deprecated since 1.3.0 in favor of {@code server.tomcat.accesslog.enabled}
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.tomcat.accesslog.enabled")
public boolean getAccessLogEnabled() {
return this.accesslog.isEnabled();
}
/**
* Set if access log is enabled.
* @param accessLogEnabled the access log enable flag
* @deprecated since 1.3.0 in favor of {@code server.tomcat.accesslog.enabled}
*/
@Deprecated
public void setAccessLogEnabled(boolean accessLogEnabled) {
getAccesslog().setEnabled(accessLogEnabled);
}
/**
* Get the format pattern for access logs.
* @return the format pattern for access logs
* @deprecated since 1.3.0 in favor of {@code server.tomcat.accesslog.pattern}
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.tomcat.accesslog.pattern")
public String getAccessLogPattern() {
return this.accesslog.getPattern();
}
/**
* Set the format pattern for access logs.
* @param accessLogPattern the pattern for access logs
* @deprecated since 1.3.0 in favor of {@code server.tomcat.accesslog.pattern}
*/
@Deprecated
public void setAccessLogPattern(String accessLogPattern) {
this.accesslog.setPattern(accessLogPattern);
}
public int getBackgroundProcessorDelay() {
return this.backgroundProcessorDelay;
}
......@@ -990,69 +926,6 @@ public class ServerProperties
return this.accesslog;
}
/**
* Get the format pattern for access logs.
* @return the format pattern for access logs
* @deprecated since 1.3.0 in favor of {@code server.undertow.accesslog.pattern}
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.undertow.accesslog.pattern")
public String getAccessLogPattern() {
return this.accesslog.getPattern();
}
/**
* Set the format pattern for access logs.
* @param accessLogPattern the pattern for access logs
* @deprecated since 1.3.0 in favor of {@code server.undertow.accesslog.pattern}
*/
@Deprecated
public void setAccessLogPattern(String accessLogPattern) {
this.accesslog.setPattern(accessLogPattern);
}
/**
* Specify if access log is enabled.
* @return {@code true} if access log is enabled
* @deprecated since 1.3.0 in favor of {@code server.undertow.accesslog.enabled}
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.undertow.accesslog.enabled")
public boolean isAccessLogEnabled() {
return this.accesslog.isEnabled();
}
/**
* Set if access log is enabled.
* @param accessLogEnabled the access log enable flag
* @deprecated since 1.3.0 in favor of {@code server.undertow.accesslog.enabled}
*/
@Deprecated
public void setAccessLogEnabled(boolean accessLogEnabled) {
getAccesslog().setEnabled(accessLogEnabled);
}
/**
* Get the access log directory.
* @return the access log directory
* @deprecated since 1.3.0 in favor of {@code server.undertow.accesslog.dir}
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.undertow.accesslog.dir")
public File getAccessLogDir() {
return this.accesslog.getDir();
}
/**
* Set the access log directory.
* @param accessLogDir the access log directory
* @deprecated since 1.3.0 in favor of {@code server.tomcat.accesslog.dir}
*/
@Deprecated
public void setAccessLogDir(File accessLogDir) {
getAccesslog().setDir(accessLogDir);
}
void customizeUndertow(ServerProperties serverProperties,
UndertowEmbeddedServletContainerFactory factory) {
factory.setBufferSize(this.bufferSize);
......
......@@ -61,7 +61,7 @@ public class ConditionalOnMissingClassTests {
}
@Configuration
@ConditionalOnMissingClass(name = "FOO")
@ConditionalOnMissingClass("FOO")
protected static class MissingConfiguration {
@Bean
public String bar() {
......
/*
* Copyright 2012-2015 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.autoconfigure.orm.jpa;
import java.util.Collections;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
/**
* Tests for {@link EntityManagerFactoryBuilder}.
*
* @author Dave Syer
*/
@Deprecated
public class EntityManagerFactoryBuilderTests {
private JpaProperties properties = new JpaProperties();
private DataSource dataSource1 = mock(DataSource.class);
private DataSource dataSource2 = mock(DataSource.class);
@Test
public void entityManagerFactoryPropertiesNotOverwritingDefaults() {
EntityManagerFactoryBuilder factory = new EntityManagerFactoryBuilder(
new HibernateJpaVendorAdapter(), this.properties, null);
LocalContainerEntityManagerFactoryBean result1 = factory
.dataSource(this.dataSource1)
.properties(Collections.singletonMap("foo", "spam")).build();
assertFalse(result1.getJpaPropertyMap().isEmpty());
assertTrue(this.properties.getProperties().isEmpty());
}
@Test
public void multipleEntityManagerFactoriesDoNotOverwriteEachOther() {
EntityManagerFactoryBuilder factory = new EntityManagerFactoryBuilder(
new HibernateJpaVendorAdapter(), this.properties, null);
LocalContainerEntityManagerFactoryBean result1 = factory
.dataSource(this.dataSource1)
.properties(Collections.singletonMap("foo", "spam")).build();
assertFalse(result1.getJpaPropertyMap().isEmpty());
LocalContainerEntityManagerFactoryBean result2 = factory
.dataSource(this.dataSource2).build();
assertTrue(result2.getJpaPropertyMap().isEmpty());
}
}
......@@ -110,7 +110,6 @@
<jstl.version>1.2</jstl.version>
<junit.version>4.12</junit.version>
<liquibase.version>3.4.2</liquibase.version>
<log4j.version>1.2.17</log4j.version>
<log4j2.version>2.4.1</log4j2.version>
<logback.version>1.1.3</logback.version>
<mariadb.version>1.2.3</mariadb.version>
......@@ -362,11 +361,6 @@
<artifactId>spring-boot-starter-undertow</artifactId>
<version>1.4.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.4.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
......@@ -854,11 +848,6 @@
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
......
......@@ -177,11 +177,6 @@
<artifactId>junit</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
......
......@@ -1313,12 +1313,11 @@ You also need to add `logging.file` to your `application.properties`:
[[howto-configure-log4j-for-logging]]
=== Configure Log4j for logging
Spring Boot also supports either http://logging.apache.org/log4j/1.2[Log4j] or
http://logging.apache.org/log4j/2.x[Log4j 2] for logging configuration, but only if one
of them is on the classpath. If you are using the starter poms for assembling
dependencies that means you have to exclude Logback and then include your chosen version
of Log4j instead. If you aren't using the starter poms then you need to provide
`commons-logging` (at least) in addition to your chosen version of Log4j.
Spring Boot supports http://logging.apache.org/log4j/2.x[Log4j 2] for logging
configuration if it is on the classpath. If you are using the starter poms for
assembling dependencies that means you have to exclude Logback and then include log4j 2
instead. If you aren't using the starter poms then you need to provide `commons-logging`
(at least) in addition to Log4j 2.
The simplest path is probably through the starter poms, even though it requires some
jiggling with excludes, .e.g. in Maven:
......@@ -1341,17 +1340,14 @@ jiggling with excludes, .e.g. in Maven:
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
----
To use Log4j 2, simply depend on `spring-boot-starter-log4j2` rather than
`spring-boot-starter-log4j`.
NOTE: The use of one of the Log4j starters gathers together the dependencies for
common logging requirements (e.g. including having Tomcat use `java.util.logging` but
configuring the output using Log4j or Log4j 2). See the Actuator Log4j or Log4j 2
samples for more detail and to see it in action.
NOTE: The use of the Log4j starters gathers together the dependencies for common logging
requirements (e.g. including having Tomcat use `java.util.logging` but configuring the
output using Log4j 2). See the Actuator Log4j 2 samples for more detail and to see it in
action.
......
......@@ -983,9 +983,9 @@ Spring Boot uses http://commons.apache.org/logging[Commons Logging] for all inte
logging, but leaves the underlying log implementation open. Default configurations are
provided for
http://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html[Java Util Logging],
http://logging.apache.org/log4j/[Log4J], http://logging.apache.org/log4j/2.x/[Log4J2] and
http://logback.qos.ch/[Logback]. In each case loggers are pre-configured to use console
output with optional file output also available.
http://logging.apache.org/log4j/2.x/[Log4J2] andhttp://logback.qos.ch/[Logback]. In each
case loggers are pre-configured to use console output with optional file output also
available.
By default, If you use the '`Starter POMs`', Logback will be used for logging. Appropriate
Logback routing is also included to ensure that dependent libraries that use
......@@ -1182,9 +1182,6 @@ Depending on your logging system, the following files will be loaded:
|Logback
|`logback-spring.xml`, `logback-spring.groovy`, `logback.xml` or `logback.groovy`
|Log4j
|`log4j-spring.properties`, `log4j-spring.xml`, `log4j.properties` or `log4j.xml`
|Log4j2
|`log4j2-spring.xml` or `log4j2.xml`
......
......@@ -517,8 +517,8 @@ swap specific technical facets.
|`spring-boot-starter-jetty`
|Imports the Jetty HTTP engine (to be used as an alternative to Tomcat).
|`spring-boot-starter-log4j`
|Support the Log4J logging framework.
|`spring-boot-starter-log4j2`
|Support the Log4J 2 logging framework.
|`spring-boot-starter-logging`
|Import Spring Boot's default logging framework (Logback).
......
......@@ -42,6 +42,11 @@
<dependencies>
<!-- Additional Dependencies the consumers of spring-boot-dependencies
will generally not need -->
<dependency> <!-- deprecated but recent version required by 3rd party libs -->
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
......
......@@ -14,8 +14,8 @@
-- A web UI example with production features
* link:spring-boot-sample-actuator-noweb[spring-boot-sample-actuator-noweb]
-- A production features sample with no web application
* link:spring-boot-sample-actuator-log4j[spring-boot-sample-actuator-log4j]
-- A production features sample using log4j for logging (instead of logback)
* link:spring-boot-sample-actuator-log4j2[spring-boot-sample-actuator-log4j2]
-- A production features sample using log4j 2 for logging (instead of logback)
* link:spring-boot-sample-cache[spring-boot-sample-cache]
-- A web sample that uses Spring's cache abstraction
* link:spring-boot-sample-web-ui[spring-boot-sample-web-ui]
......
......@@ -24,7 +24,6 @@
<module>spring-boot-sample-ant</module>
<module>spring-boot-sample-activemq</module>
<module>spring-boot-sample-actuator</module>
<module>spring-boot-sample-actuator-log4j</module>
<module>spring-boot-sample-actuator-log4j2</module>
<module>spring-boot-sample-actuator-noweb</module>
<module>spring-boot-sample-actuator-ui</module>
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- Your own application should inherit from spring-boot-starter-parent -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-samples</artifactId>
<version>1.4.0.BUILD-SNAPSHOT</version>
</parent>
<artifactId>spring-boot-sample-actuator-log4j</artifactId>
<name>Spring Boot Actuator Log4j Sample</name>
<description>Spring Boot Actuator Log4j Sample</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
/*
* Copyright 2012-2013 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 sample.actuator.log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class HelloWorldService {
@Autowired
private ServiceProperties configuration;
public String getHelloMessage() {
return "Hello " + this.configuration.getName();
}
}
/*
* Copyright 2012-2013 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 sample.actuator.log4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SampleActuatorLog4JApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleActuatorLog4JApplication.class, args);
}
}
/*
* Copyright 2012-2013 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 sample.actuator.log4j;
import java.util.Collections;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class SampleController {
@Autowired
private HelloWorldService helloWorldService;
@RequestMapping("/")
@ResponseBody
public Map<String, String> helloWorld() {
return Collections.singletonMap("message",
this.helloWorldService.getHelloMessage());
}
@RequestMapping("/foo")
@ResponseBody
public String foo() {
throw new IllegalArgumentException("Server error");
}
}
/*
* 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 sample.actuator.log4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "service", ignoreUnknownFields = false)
@Component
public class ServiceProperties {
private String name = "World";
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
#logging.file: /tmp/logs/app.log
#server.port: 8080
#management.port: 8080
management.address: 127.0.0.1
endpoints.shutdown.enabled: true
server.tomcat.basedir: target/tomcat
server.tomcat.access_log_pattern: %h %t "%r" %s %b
security.require_ssl: false
service.name: Phil
shell.ssh.enabled: true
shell.ssh.port: 2222
#shell.telnet.enabled: false
#shell.telnet.port: 1111
shell.auth: spring
#shell.auth: key
#shell.auth.key.path: ${user.home}/test/id_rsa.pub.pem
#shell.auth: simple
log4j.rootCategory=INFO, CONSOLE
PID=????
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] log4j%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.apache.tomcat.util.net.NioSelectorPool=WARN
log4j.category.org.apache.catalina.startup.DigesterFactory=ERROR
/*
* 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 sample.actuator.log4j;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.boot.test.TestRestTemplate;
import org.springframework.boot.test.WebIntegrationTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* Basic integration tests for service demo application.
*
* @author Dave Syer
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SampleActuatorLog4JApplication.class)
@WebIntegrationTest(randomPort = true)
@DirtiesContext
public class SampleActuatorApplicationTests {
@Value("${local.server.port}")
private int port;
@Test
public void testHome() throws Exception {
@SuppressWarnings("rawtypes")
ResponseEntity<Map> entity = new TestRestTemplate()
.getForEntity("http://localhost:" + this.port, Map.class);
assertEquals(HttpStatus.OK, entity.getStatusCode());
@SuppressWarnings("unchecked")
Map<String, Object> body = entity.getBody();
assertEquals("Hello Phil", body.get("message"));
}
@Test
public void testHealth() throws Exception {
@SuppressWarnings("rawtypes")
ResponseEntity<Map> entity = new TestRestTemplate()
.getForEntity("http://localhost:" + this.port + "/health", Map.class);
assertEquals(HttpStatus.OK, entity.getStatusCode());
@SuppressWarnings("unchecked")
Map<String, Object> body = entity.getBody();
assertNotNull(body.get("diskSpace"));
}
}
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
log4j.category.org.springframework.web=DEBUG
......@@ -46,7 +46,6 @@
<module>spring-boot-starter-jta-atomikos</module>
<module>spring-boot-starter-jta-bitronix</module>
<module>spring-boot-starter-logging</module>
<module>spring-boot-starter-log4j</module>
<module>spring-boot-starter-log4j2</module>
<module>spring-boot-starter-mail</module>
<module>spring-boot-starter-mobile</module>
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>1.4.0.BUILD-SNAPSHOT</version>
</parent>
<artifactId>spring-boot-starter-log4j</artifactId>
<name>Spring Boot Log4J Starter</name>
<description>Spring Boot Log4J Starter</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
</project>
......@@ -20,7 +20,7 @@
<goal>repackage</goal>
</goals>
<configuration>
<excludeGroupIds>log4j</excludeGroupIds>
<excludeGroupIds>org.apache.logging.log4j</excludeGroupIds>
</configuration>
</execution>
</executions>
......@@ -52,9 +52,9 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
</project>
......@@ -22,6 +22,6 @@ new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) {
@Override
protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception {
super.verifyZipEntries(verifier)
verifier.assertHasNoEntryNameStartingWith("lib/log4j-1.2.17.jar")
verifier.assertHasNoEntryNameStartingWith("lib/log4j-api-2.4.1.jar")
}
}.verify();
......@@ -52,9 +52,9 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>@log4j.version@</version>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.4.1</version>
<scope>test</scope>
</dependency>
</dependencies>
......
......@@ -22,6 +22,6 @@ new Verify.JarArchiveVerification(f, Verify.SAMPLE_APP) {
@Override
protected void verifyZipEntries(Verify.ArchiveVerifier verifier) throws Exception {
super.verifyZipEntries(verifier)
verifier.assertHasNoEntryNameStartingWith("lib/log4j-1.2.17.jar")
verifier.assertHasNoEntryNameStartingWith("lib/log4j-api-2.4.1.jar")
}
}.verify();
......@@ -57,9 +57,9 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>@log4j.version@</version>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>@log4j2.version@</version>
</dependency>
</dependencies>
</project>
......@@ -23,8 +23,8 @@
<configuration>
<excludes>
<exclude>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclude>
</excludes>
<excludeGroupIds>javax.servlet</excludeGroupIds>
......@@ -36,9 +36,9 @@
</build>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>@log4j.version@</version>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>@log4j2.version@</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
......
......@@ -84,11 +84,6 @@
<artifactId>junit</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
......
......@@ -773,7 +773,6 @@ public class SpringApplication {
*/
protected void afterRefresh(ConfigurableApplicationContext context,
ApplicationArguments args) {
afterRefresh(context, args.getSourceArgs());
callRunners(context, args);
}
......@@ -810,17 +809,6 @@ public class SpringApplication {
}
}
/**
* Called after the context has been refreshed.
* @param context the application context
* @param args the application arguments
* @deprecated in 1.3 in favor of
* {@link #afterRefresh(ConfigurableApplicationContext, ApplicationArguments)}
*/
@Deprecated
protected void afterRefresh(ConfigurableApplicationContext context, String[] args) {
}
private void handleRunFailure(ConfigurableApplicationContext context,
SpringApplicationRunListeners listeners, Throwable exception) {
if (logger.isErrorEnabled()) {
......@@ -969,17 +957,6 @@ public class SpringApplication {
this.banner = banner;
}
/**
* Sets if the Spring banner should be displayed when the application runs. Defaults
* to {@code true}.
* @param showBanner if the banner should be shown
* @deprecated since 1.3.0 in favor of {@link #setBannerMode}
*/
@Deprecated
public void setShowBanner(boolean showBanner) {
setBannerMode(showBanner ? Banner.Mode.CONSOLE : Banner.Mode.OFF);
}
/**
* Sets the mode used to display the banner when the application runs. Defaults to
* {@code Banner.Mode.CONSOLE}.
......
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -23,112 +23,10 @@ package org.springframework.boot.ansi;
*/
public interface AnsiElement {
/**
* @deprecated in 1.3.0 in favor of {@link AnsiStyle#NORMAL}
*/
@Deprecated
AnsiElement NORMAL = new DefaultAnsiElement("0");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiStyle#BOLD}
*/
@Deprecated
AnsiElement BOLD = new DefaultAnsiElement("1");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiStyle#FAINT}
*/
@Deprecated
AnsiElement FAINT = new DefaultAnsiElement("2");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiStyle#ITALIC}
*/
@Deprecated
AnsiElement ITALIC = new DefaultAnsiElement("3");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiStyle#UNDERLINE}
*/
@Deprecated
AnsiElement UNDERLINE = new DefaultAnsiElement("4");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#BLACK}
*/
@Deprecated
AnsiElement BLACK = new DefaultAnsiElement("30");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#RED}
*/
@Deprecated
AnsiElement RED = new DefaultAnsiElement("31");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#GREEN}
*/
@Deprecated
AnsiElement GREEN = new DefaultAnsiElement("32");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#YELLOW}
*/
@Deprecated
AnsiElement YELLOW = new DefaultAnsiElement("33");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#BLUE}
*/
@Deprecated
AnsiElement BLUE = new DefaultAnsiElement("34");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#MAGENTA}
*/
@Deprecated
AnsiElement MAGENTA = new DefaultAnsiElement("35");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#CYAN}
*/
@Deprecated
AnsiElement CYAN = new DefaultAnsiElement("36");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#WHITE}
*/
@Deprecated
AnsiElement WHITE = new DefaultAnsiElement("37");
/**
* @deprecated in 1.3.0 in favor of {@link AnsiColor#DEFAULT}
*/
@Deprecated
AnsiElement DEFAULT = new DefaultAnsiElement("39");
/**
* @return the ANSI escape code
*/
@Override
String toString();
/**
* Internal default {@link AnsiElement} implementation.
*/
class DefaultAnsiElement implements AnsiElement {
private final String code;
DefaultAnsiElement(String code) {
this.code = code;
}
@Override
public String toString() {
return this.code;
}
}
}
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -313,18 +313,6 @@ public class SpringApplicationBuilder {
return this;
}
/**
* Flag to indicate the startup banner should be printed.
* @param showBanner the flag to set. Default true.
* @return the current builder
* @deprecated Since 1.3.0 in favor of {@link #bannerMode}
*/
@Deprecated
public SpringApplicationBuilder showBanner(boolean showBanner) {
this.application.setShowBanner(showBanner);
return this;
}
public SpringApplicationBuilder bannerMode(Banner.Mode bannerMode) {
this.application.setBannerMode(bannerMode);
return this;
......
/*
* Copyright 2010-2015 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.cloudfoundry;
import org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.Environment;
/**
* An {@link EnvironmentPostProcessor} that knows where to find VCAP (a.k.a. Cloud
* Foundry) meta data in the existing environment. It parses out the VCAP_APPLICATION and
* VCAP_SERVICES meta data and dumps it in a form that is easily consumed by
* {@link Environment} users. If the app is running in Cloud Foundry then both meta data
* items are JSON objects encoded in OS environment variables. VCAP_APPLICATION is a
* shallow hash with basic information about the application (name, instance id, instance
* index, etc.), and VCAP_SERVICES is a hash of lists where the keys are service labels
* and the values are lists of hashes of service instance meta data. Examples are:
*
* <pre class="code">
* VCAP_APPLICATION: {"instance_id":"2ce0ac627a6c8e47e936d829a3a47b5b","instance_index":0,
* "version":"0138c4a6-2a73-416b-aca0-572c09f7ca53","name":"foo",
* "uris":["foo.cfapps.io"], ...}
* VCAP_SERVICES: {"rds-mysql-1.0":[{"name":"mysql","label":"rds-mysql-1.0","plan":"10mb",
* "credentials":{"name":"d04fb13d27d964c62b267bbba1cffb9da","hostname":"mysql-service-public.clqg2e2w3ecf.us-east-1.rds.amazonaws.com",
* "host":"mysql-service-public.clqg2e2w3ecf.us-east-1.rds.amazonaws.com","port":3306,"user":"urpRuqTf8Cpe6",
* "username":"urpRuqTf8Cpe6","password":"pxLsGVpsC9A5S"}
* }]}
* </pre>
*
* These objects are flattened into properties. The VCAP_APPLICATION object goes straight
* to {@code vcap.application.*} in a fairly obvious way, and the VCAP_SERVICES object is
* unwrapped so that it is a hash of objects with key equal to the service instance name
* (e.g. "mysql" in the example above), and value equal to that instances properties, and
* then flattened in the same way. E.g.
*
* <pre class="code">
* vcap.application.instance_id: 2ce0ac627a6c8e47e936d829a3a47b5b
* vcap.application.version: 0138c4a6-2a73-416b-aca0-572c09f7ca53
* vcap.application.name: foo
* vcap.application.uris[0]: foo.cfapps.io
*
* vcap.services.mysql.name: mysql
* vcap.services.mysql.label: rds-mysql-1.0
* vcap.services.mysql.credentials.name: d04fb13d27d964c62b267bbba1cffb9da
* vcap.services.mysql.credentials.port: 3306
* vcap.services.mysql.credentials.host: mysql-service-public.clqg2e2w3ecf.us-east-1.rds.amazonaws.com
* vcap.services.mysql.credentials.username: urpRuqTf8Cpe6
* vcap.services.mysql.credentials.password: pxLsGVpsC9A5S
* ...
* </pre>
*
* N.B. this initializer is mainly intended for informational use (the application and
* instance ids are particularly useful). For service binding you might find that Spring
* Cloud is more convenient and more robust against potential changes in Cloud Foundry.
*
* @author Dave Syer
* @author Andy Wilkinson
* @deprecated since 1.3.0 in favor of CloudFoundryVcapEnvironmentPostProcessor
*/
@Deprecated
public class VcapEnvironmentPostProcessor
extends CloudFoundryVcapEnvironmentPostProcessor {
}
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -270,12 +270,6 @@ public abstract class AbstractConfigurableEmbeddedServletContainer
this.registerDefaultServlet = registerDefaultServlet;
}
@Override
public void setRegisterJspServlet(boolean registerJspServlet) {
Assert.notNull(this.jspServlet);
this.jspServlet.setRegistered(registerJspServlet);
}
/**
* Flag to indicate that the default servlet should be registered.
* @return true if the default servlet is to be registered
......@@ -293,12 +287,6 @@ public abstract class AbstractConfigurableEmbeddedServletContainer
return this.ssl;
}
@Override
public void setJspServletClassName(String jspServletClassName) {
Assert.notNull(this.jspServlet);
this.jspServlet.setClassName(jspServletClassName);
}
@Override
public void setJspServlet(JspServlet jspServlet) {
this.jspServlet = jspServlet;
......
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -92,32 +92,6 @@ public interface ConfigurableEmbeddedServletContainer {
*/
void setAddress(InetAddress address);
/**
* The class name for the jsp servlet if used. If
* {@link #setRegisterJspServlet(boolean) registerJspServlet} is true <b>and</b> this
* class is on the classpath then it will be registered. Since both Tomcat and Jetty
* use Jasper for their JSP implementation the default is
* {@code org.apache.jasper.servlet.JspServlet}.
* @param jspServletClassName the class name for the JSP servlet if used
* @deprecated in 1.3.0 in favor of {@link JspServlet#setClassName(String)}
* @see #setJspServlet
* @see JspServlet#setClassName(String)
*/
@Deprecated
void setJspServletClassName(String jspServletClassName);
/**
* Set if the JspServlet should be registered if it is on the classpath. Defaults to
* {@code true} so that files from the {@link #setDocumentRoot(File) document root}
* will be served.
* @param registerJspServlet if the JSP servlet should be registered
* @deprecated in 1.3.0 in favor of {@link JspServlet#setRegistered(boolean)}
* @see #setJspServlet
* @see JspServlet#setRegistered(boolean)
*/
@Deprecated
void setRegisterJspServlet(boolean registerJspServlet);
/**
* Set if the DefaultServlet should be registered. Defaults to {@code true} so that
* files from the {@link #setDocumentRoot(File) document root} will be served.
......
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -45,8 +45,6 @@ public abstract class LoggingSystem {
"org.springframework.boot.logging.logback.LogbackLoggingSystem");
systems.put("org.apache.logging.log4j.core.impl.Log4jContextFactory",
"org.springframework.boot.logging.log4j2.Log4J2LoggingSystem");
systems.put("org.apache.log4j.PropertyConfigurator",
"org.springframework.boot.logging.log4j.Log4JLoggingSystem");
systems.put("java.util.logging.LogManager",
"org.springframework.boot.logging.java.JavaLoggingSystem");
SYSTEMS = Collections.unmodifiableMap(systems);
......@@ -69,20 +67,6 @@ public abstract class LoggingSystem {
*/
public void initialize(LoggingInitializationContext initializationContext,
String configLocation, LogFile logFile) {
initialize(configLocation, logFile);
}
/**
* 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
* @deprecated since 1.3 in favor of
* {@link #initialize(LoggingInitializationContext, String, LogFile)}
*/
@Deprecated
public void initialize(String configLocation, LogFile logFile) {
}
/**
......@@ -110,8 +94,7 @@ public abstract class LoggingSystem {
public abstract void setLogLevel(String loggerName, LogLevel level);
/**
* Detect and return the logging system in use. Supports Logback, Log4J, Log4J2 and
* Java Logging.
* Detect and return the logging system in use. Supports Logback and Java Logging.
* @param classLoader the classloader
* @return The logging system
*/
......
/*
* Copyright 2012-2015 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.log4j;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.boot.logging.LogFile;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingInitializationContext;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.boot.logging.Slf4JLoggingSystem;
import org.springframework.util.Assert;
import org.springframework.util.Log4jConfigurer;
import org.springframework.util.StringUtils;
/**
* {@link LoggingSystem} for <a href="http://logging.apache.org/log4j/1.2">Log4j</a>.
*
* @author Phillip Webb
* @author Dave Syer
* @author Andy Wilkinson
* @deprecated in Spring Boot 1.3 in favor of Apache Log4j 2 (following Apache's EOL
* declaration for log4j 1.x)
*/
@Deprecated
public class Log4JLoggingSystem extends Slf4JLoggingSystem {
private static final Map<LogLevel, Level> LEVELS;
static {
Map<LogLevel, Level> levels = new HashMap<LogLevel, Level>();
levels.put(LogLevel.TRACE, Level.TRACE);
levels.put(LogLevel.DEBUG, Level.DEBUG);
levels.put(LogLevel.INFO, Level.INFO);
levels.put(LogLevel.WARN, Level.WARN);
levels.put(LogLevel.ERROR, Level.ERROR);
levels.put(LogLevel.FATAL, Level.FATAL);
levels.put(LogLevel.OFF, Level.OFF);
LEVELS = Collections.unmodifiableMap(levels);
}
public Log4JLoggingSystem(ClassLoader classLoader) {
super(classLoader);
}
@Override
protected String[] getStandardConfigLocations() {
return new String[] { "log4j.xml", "log4j.properties" };
}
@Override
public void beforeInitialize() {
super.beforeInitialize();
LogManager.getRootLogger().setLevel(Level.FATAL);
}
@Override
protected void loadDefaults(LoggingInitializationContext initializationContext,
LogFile logFile) {
if (logFile != null) {
loadConfiguration(getPackagedConfigFile("log4j-file.properties"), logFile);
}
else {
loadConfiguration(getPackagedConfigFile("log4j.properties"), logFile);
}
}
@Override
protected void loadConfiguration(LoggingInitializationContext initializationContext,
String location, LogFile logFile) {
loadConfiguration(location, logFile);
}
protected void loadConfiguration(String location, LogFile logFile) {
Assert.notNull(location, "Location must not be null");
if (logFile != null) {
logFile.applyToSystemProperties();
}
try {
Log4jConfigurer.initLogging(location);
}
catch (Exception ex) {
throw new IllegalStateException(
"Could not initialize Log4J logging from " + location, ex);
}
}
@Override
protected void reinitialize(LoggingInitializationContext initializationContext) {
loadConfiguration(getSelfInitializationConfig(), null);
}
@Override
public void setLogLevel(String loggerName, LogLevel level) {
Logger logger = (StringUtils.hasLength(loggerName)
? LogManager.getLogger(loggerName) : LogManager.getRootLogger());
logger.setLevel(LEVELS.get(level));
}
@Override
public Runnable getShutdownHandler() {
return new ShutdownHandler();
}
private static final class ShutdownHandler implements Runnable {
@Override
public void run() {
LogManager.shutdown();
}
}
}
/*
* 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.
*/
/**
* Support for the Log4j logging library.
*/
package org.springframework.boot.logging.log4j;
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-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.
......@@ -195,7 +195,7 @@ public class LevelRemappingAppender extends AppenderBase<ILoggingEvent> {
@Override
@Deprecated
public Map<String, String> getMdc() {
return this.event.getMdc();
return this.event.getMDCPropertyMap();
}
@Override
......
/*
* Copyright 2012-2015 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.test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.core.env.Environment;
/**
* {@link ApplicationContextInitializer} that sets {@link Environment} properties for the
* ports that {@link EmbeddedServletContainer} servers are actually listening on. The
* property {@literal "local.server.port"} can be injected directly into tests using
* {@link Value @Value} or obtained via the {@link Environment}.
* <p>
* If the {@link EmbeddedWebApplicationContext} has a
* {@link EmbeddedWebApplicationContext#setNamespace(String) namespace} set, it will be
* used to construct the property name. For example, the "management" actuator context
* will have the property name {@literal "local.management.port"}.
* <p>
* Properties are automatically propagated up to any parent context.
*
* @author Dave Syer
* @author Phillip Webb
* @deprecated since 1.3 in favor of
* org.springframework.boot.context.web.ServerPortInfoApplicationContextInitializer
*/
@Deprecated
public class ServerPortInfoApplicationContextInitializer extends
org.springframework.boot.context.web.ServerPortInfoApplicationContextInitializer {
}
log4j.rootCategory=INFO, CONSOLE, FILE
PID=????
LOG_PATH=${java.io.tmpdir}
LOG_FILE=${LOG_PATH}/spring.log
LOG_LEVEL_PATTERN=%5p
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${PID} ${LOG_LEVEL_PATTERN} [%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.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
log4j.rootCategory=INFO, CONSOLE
PID=????
LOG_LEVEL_PATTERN=%5p
LOG_PATTERN=[%d{yyyy-MM-dd HH:mm:ss.SSS}] boot%X{context} - ${PID} ${LOG_LEVEL_PATTERN} [%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.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
......@@ -177,24 +177,6 @@ public class SpringApplicationTests {
verify(application, never()).printBanner((Environment) anyObject());
}
@SuppressWarnings("deprecation")
@Test
public void disableBannerWithBoolean() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
application.setShowBanner(false);
this.context = application.run();
verify(application, never()).printBanner((Environment) anyObject());
}
@Test
public void disableBannerViaShowBannerProperty() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
this.context = application.run("--spring.main.show_banner=false");
verify(application, never()).printBanner((Environment) anyObject());
}
@Test
public void disableBannerViaBannerModeProperty() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
......
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-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.
......@@ -499,11 +499,6 @@ public class LoggingApplicationListenerTests {
}
@Override
public void initialize(String configLocation, LogFile logFile) {
}
@Override
public void setLogLevel(String loggerName, LogLevel level) {
......
/*
* Copyright 2012-2015 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.log4j;
import java.io.File;
import java.util.logging.Handler;
import java.util.logging.LogManager;
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.slf4j.bridge.SLF4JBridgeHandler;
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;
/**
* Tests for {@link Log4JLoggingSystem}.
*
* @author Phillip Webb
* @author Andy Wilkinson
*/
@SuppressWarnings("deprecation")
public class Log4JLoggingSystemTests extends AbstractLoggingSystemTests {
@Rule
public OutputCapture output = new OutputCapture();
private final Log4JLoggingSystem loggingSystem = new Log4JLoggingSystem(
getClass().getClassLoader());
private Log4JLogger logger;
@Before
public void setup() {
this.logger = new Log4JLogger(getClass().getName());
}
@Override
@After
public void clear() {
this.loggingSystem.cleanUp();
}
@Test
public void noFile() throws Exception {
this.loggingSystem.beforeInitialize();
this.logger.info("Hidden");
this.loggingSystem.initialize(null, 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 {
this.loggingSystem.beforeInitialize();
this.logger.info("Hidden");
this.loggingSystem.initialize(null, null, getLogFile(null, tmpDir()));
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
public void testNonDefaultConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
this.loggingSystem.initialize(null, "classpath:log4j-nondefault.properties",
getLogFile(null, tmpDir()));
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 = IllegalStateException.class)
public void testNonexistentConfigLocation() throws Exception {
this.loggingSystem.beforeInitialize();
this.loggingSystem.initialize(null, "classpath:log4j-nonexistent.xml", null);
}
@Test
public void setLevel() throws Exception {
this.loggingSystem.beforeInitialize();
this.loggingSystem.initialize(null, null, null);
this.logger.debug("Hello");
this.loggingSystem.setLogLevel("org.springframework.boot", LogLevel.DEBUG);
this.logger.debug("Hello");
assertThat(StringUtils.countOccurrencesOf(this.output.toString(), "Hello"),
equalTo(1));
}
@Test
@Ignore("Fails on Bamboo")
public void loggingThatUsesJulIsCaptured() {
this.loggingSystem.beforeInitialize();
this.loggingSystem.initialize(null, null, null);
java.util.logging.Logger julLogger = java.util.logging.Logger
.getLogger(getClass().getName());
julLogger.severe("Hello world");
String output = this.output.toString().trim();
assertTrue("Wrong output:\n" + output, output.contains("Hello world"));
}
@Test
public void bridgeHandlerLifecycle() {
assertFalse(bridgeHandlerInstalled());
this.loggingSystem.beforeInitialize();
assertTrue(bridgeHandlerInstalled());
this.loggingSystem.cleanUp();
assertFalse(bridgeHandlerInstalled());
}
private boolean bridgeHandlerInstalled() {
java.util.logging.Logger rootLogger = LogManager.getLogManager().getLogger("");
Handler[] handlers = rootLogger.getHandlers();
for (Handler handler : handlers) {
if (handler instanceof SLF4JBridgeHandler) {
return true;
}
}
return false;
}
}
log4j.reset=true
log4j.rootCategory=INFO, CONSOLE
PID=????
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.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=${LOG_PATTERN}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment