Skip to content

Commit 885f9a3

Browse files
committed
Add support for configuring logging via JMX
1 parent e39e084 commit 885f9a3

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,22 @@
1616

1717
package org.springframework.boot.logging.logback;
1818

19+
import java.io.FileNotFoundException;
20+
import java.lang.management.ManagementFactory;
1921
import java.net.URL;
2022
import java.security.CodeSource;
2123
import java.security.ProtectionDomain;
2224
import java.util.ArrayList;
2325
import java.util.List;
2426
import java.util.Set;
2527

28+
import javax.management.MBeanServer;
29+
import javax.management.ObjectName;
30+
2631
import ch.qos.logback.classic.Level;
2732
import ch.qos.logback.classic.LoggerContext;
33+
import ch.qos.logback.classic.jmx.JMXConfigurator;
34+
import ch.qos.logback.classic.jmx.MBeanUtil;
2835
import ch.qos.logback.classic.joran.JoranConfigurator;
2936
import ch.qos.logback.classic.jul.LevelChangePropagator;
3037
import ch.qos.logback.classic.turbo.TurboFilter;
@@ -56,6 +63,7 @@
5663
* @author Dave Syer
5764
* @author Andy Wilkinson
5865
* @author Ben Hale
66+
* @author Vedran Pavic
5967
*/
6068
public class LogbackLoggingSystem extends Slf4JLoggingSystem {
6169

@@ -126,6 +134,7 @@ protected void loadDefaults(LoggingInitializationContext initializationContext,
126134
LogFile logFile) {
127135
LoggerContext context = getLoggerContext();
128136
stopAndReset(context);
137+
registerJmxConfigurator(context, initializationContext, null, logFile);
129138
LogbackConfigurator configurator = new LogbackConfigurator(context);
130139
Environment environment = initializationContext.getEnvironment();
131140
context.putProperty(LoggingSystemProperties.LOG_LEVEL_PATTERN,
@@ -145,6 +154,7 @@ protected void loadConfiguration(LoggingInitializationContext initializationCont
145154
super.loadConfiguration(initializationContext, location, logFile);
146155
LoggerContext loggerContext = getLoggerContext();
147156
stopAndReset(loggerContext);
157+
registerJmxConfigurator(loggerContext, initializationContext, location, logFile);
148158
try {
149159
configureByResourceUrl(initializationContext, loggerContext,
150160
ResourceUtils.getURL(location));
@@ -196,6 +206,28 @@ private void addLevelChangePropagator(LoggerContext loggerContext) {
196206
loggerContext.addListener(levelChangePropagator);
197207
}
198208

209+
private void registerJmxConfigurator(LoggerContext loggerContext,
210+
LoggingInitializationContext initializationContext, String configLocation,
211+
LogFile logFile) {
212+
String objectNameAsStr = MBeanUtil.getObjectNameFor(
213+
loggerContext.getName(), JMXConfigurator.class);
214+
ObjectName objectName = MBeanUtil.string2ObjectName(
215+
loggerContext, this, objectNameAsStr);
216+
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
217+
if (!MBeanUtil.isRegistered(mbs, objectName)) {
218+
LoggingSystemJMXConfigurator jmxConfigurator =
219+
new LoggingSystemJMXConfigurator(loggerContext, mbs, objectName,
220+
initializationContext, configLocation, logFile);
221+
try {
222+
mbs.registerMBean(jmxConfigurator, objectName);
223+
}
224+
catch (Exception e) {
225+
getLogger(LogbackLoggingSystem.class.getName()).error(
226+
"Failed to create mbean", e);
227+
}
228+
}
229+
}
230+
199231
@Override
200232
public void cleanUp() {
201233
LoggerContext context = getLoggerContext();
@@ -317,4 +349,34 @@ public void run() {
317349

318350
}
319351

352+
private class LoggingSystemJMXConfigurator extends JMXConfigurator {
353+
354+
private LoggingInitializationContext initializationContext;
355+
356+
private String configLocation;
357+
358+
private LogFile logFile;
359+
360+
LoggingSystemJMXConfigurator(LoggerContext loggerContext, MBeanServer mbs,
361+
ObjectName objectName, LoggingInitializationContext initializationContext,
362+
String configLocation, LogFile logFile) {
363+
super(loggerContext, mbs, objectName);
364+
this.initializationContext = initializationContext;
365+
this.configLocation = configLocation;
366+
this.logFile = logFile;
367+
}
368+
369+
@Override
370+
public void reloadDefaultConfiguration() throws JoranException {
371+
initialize(this.initializationContext, this.configLocation, this.logFile);
372+
}
373+
374+
@Override
375+
public void reloadByFileName(String fileName)
376+
throws JoranException, FileNotFoundException {
377+
initialize(this.initializationContext, fileName, this.logFile);
378+
}
379+
380+
}
381+
320382
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@
1818

1919
import java.io.File;
2020
import java.io.FileReader;
21+
import java.lang.management.ManagementFactory;
2122
import java.util.EnumSet;
2223
import java.util.List;
2324
import java.util.logging.Handler;
2425
import java.util.logging.LogManager;
2526

27+
import javax.management.ObjectName;
28+
2629
import ch.qos.logback.classic.Level;
2730
import ch.qos.logback.classic.Logger;
2831
import ch.qos.logback.classic.LoggerContext;
@@ -137,6 +140,8 @@ public void withFile() throws Exception {
137140
public void testBasicConfigLocation() throws Exception {
138141
this.loggingSystem.beforeInitialize();
139142
assertThat(getConsoleAppender()).isNotNull();
143+
assertThat(ManagementFactory.getPlatformMBeanServer().queryMBeans(
144+
new ObjectName("ch.qos.logback.classic:Name=default,*"), null)).hasSize(1);
140145
}
141146

142147
@Test

0 commit comments

Comments
 (0)