Polish contribution

Closes gh-7219
pull/7671/head
Stephane Nicoll 8 years ago
parent 60e054d0e4
commit f560f338ab

@ -24,6 +24,8 @@ import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.boot.logging.LogLevel; import org.springframework.boot.logging.LogLevel;
import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.util.Assert;
/** /**
* Adapter to expose {@link LoggersEndpoint} as an {@link MvcEndpoint}. * Adapter to expose {@link LoggersEndpoint} as an {@link MvcEndpoint}.
@ -31,6 +33,7 @@ import org.springframework.jmx.export.annotation.ManagedOperation;
* @author Vedran Pavic * @author Vedran Pavic
* @since 1.5.0 * @since 1.5.0
*/ */
@ManagedResource
public class LoggersEndpointMBean extends EndpointMBean { public class LoggersEndpointMBean extends EndpointMBean {
public LoggersEndpointMBean(String beanName, Endpoint<?> endpoint, public LoggersEndpointMBean(String beanName, Endpoint<?> endpoint,
@ -38,19 +41,21 @@ public class LoggersEndpointMBean extends EndpointMBean {
super(beanName, endpoint, objectMapper); super(beanName, endpoint, objectMapper);
} }
@ManagedAttribute(description = "Get levels for all known loggers") @ManagedAttribute(description = "Get log levels for all known loggers")
public Object getLoggers() { public Object getLoggers() {
return convert(getEndpoint().invoke()); return convert(getEndpoint().invoke());
} }
@ManagedOperation(description = "Get level for a given logger") @ManagedOperation(description = "Get log level for a given logger")
public Object getLogger(String loggerName) { public Object getLogger(String loggerName) {
return convert(getEndpoint().invoke(loggerName)); return convert(getEndpoint().invoke(loggerName));
} }
@ManagedOperation(description = "Set log level for a given logger") @ManagedOperation(description = "Set log level for a given logger")
public void setLogLevel(String loggerName, String logLevel) { public void setLogLevel(String loggerName, String logLevel) {
getEndpoint().setLogLevel(loggerName, LogLevel.valueOf(logLevel)); Assert.notNull(logLevel, "LogLevel must not be null");
LogLevel level = LogLevel.valueOf(logLevel.toUpperCase());
getEndpoint().setLogLevel(loggerName, level);
} }
@Override @Override

@ -26,18 +26,23 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import javax.management.MBeanException;
import javax.management.MBeanInfo; import javax.management.MBeanInfo;
import javax.management.MalformedObjectNameException; import javax.management.MalformedObjectNameException;
import javax.management.ObjectName; import javax.management.ObjectName;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.After; import org.junit.After;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.actuate.endpoint.AbstractEndpoint; import org.springframework.boot.actuate.endpoint.AbstractEndpoint;
import org.springframework.boot.actuate.endpoint.LoggersEndpoint;
import org.springframework.boot.logging.logback.LogbackLoggingSystem;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext; import org.springframework.context.support.GenericApplicationContext;
import org.springframework.jmx.export.MBeanExporter; import org.springframework.jmx.export.MBeanExporter;
@ -45,15 +50,21 @@ import org.springframework.jmx.support.ObjectNameManager;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.junit.internal.matchers.ThrowableMessageMatcher.hasMessage;
/** /**
* Tests for {@link EndpointMBeanExporter} * Tests for {@link EndpointMBeanExporter}
* *
* @author Christian Dupuis * @author Christian Dupuis
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Stephane Nicoll
*/ */
public class EndpointMBeanExporterTests { public class EndpointMBeanExporterTests {
@Rule
public ExpectedException thrown = ExpectedException.none();
GenericApplicationContext context = null; GenericApplicationContext context = null;
@After @After
@ -253,6 +264,42 @@ public class EndpointMBeanExporterTests {
assertThat(((List<?>) response).get(0)).isInstanceOf(Long.class); assertThat(((List<?>) response).get(0)).isInstanceOf(Long.class);
} }
@Test
public void loggerEndpointLowerCaseLogLevel() throws Exception {
MBeanExporter mbeanExporter = registerLoggersEndpoint();
Object response = mbeanExporter.getServer().invoke(
getObjectName("loggersEndpoint", this.context), "setLogLevel",
new Object[]{"com.example", "trace"},
new String[]{String.class.getName(), String.class.getName()});
assertThat(response).isNull();
}
@Test
public void loggerEndpointUnknownLogLevel() throws Exception {
MBeanExporter mbeanExporter = registerLoggersEndpoint();
this.thrown.expect(MBeanException.class);
this.thrown.expectCause(hasMessage(containsString("No enum constant")));
this.thrown.expectCause(hasMessage(containsString("LogLevel.INVALID")));
mbeanExporter.getServer().invoke(
getObjectName("loggersEndpoint", this.context), "setLogLevel",
new Object[]{"com.example", "invalid"},
new String[]{String.class.getName(), String.class.getName()});
}
private MBeanExporter registerLoggersEndpoint() {
this.context = new GenericApplicationContext();
this.context.registerBeanDefinition("endpointMbeanExporter",
new RootBeanDefinition(EndpointMBeanExporter.class));
RootBeanDefinition bd = new RootBeanDefinition(LoggersEndpoint.class);
ConstructorArgumentValues values = new ConstructorArgumentValues();
values.addIndexedArgumentValue(0,
new LogbackLoggingSystem(getClass().getClassLoader()));
bd.setConstructorArgumentValues(values);
this.context.registerBeanDefinition("loggersEndpoint", bd);
this.context.refresh();
return this.context.getBean(EndpointMBeanExporter.class);
}
private ObjectName getObjectName(String beanKey, GenericApplicationContext context) private ObjectName getObjectName(String beanKey, GenericApplicationContext context)
throws MalformedObjectNameException { throws MalformedObjectNameException {
return getObjectName("org.springframework.boot", beanKey, false, context); return getObjectName("org.springframework.boot", beanKey, false, context);

Loading…
Cancel
Save