1616
1717package org .springframework .boot .logging .logback ;
1818
19+ import java .io .FileNotFoundException ;
20+ import java .lang .management .ManagementFactory ;
1921import java .net .URL ;
2022import java .security .CodeSource ;
2123import java .security .ProtectionDomain ;
2224import java .util .ArrayList ;
2325import java .util .List ;
2426import java .util .Set ;
2527
28+ import javax .management .MBeanServer ;
29+ import javax .management .ObjectName ;
30+
2631import ch .qos .logback .classic .Level ;
2732import ch .qos .logback .classic .LoggerContext ;
33+ import ch .qos .logback .classic .jmx .JMXConfigurator ;
34+ import ch .qos .logback .classic .jmx .MBeanUtil ;
2835import ch .qos .logback .classic .joran .JoranConfigurator ;
2936import ch .qos .logback .classic .jul .LevelChangePropagator ;
3037import ch .qos .logback .classic .turbo .TurboFilter ;
5461 * @author Dave Syer
5562 * @author Andy Wilkinson
5663 * @author Ben Hale
64+ * @author Vedran Pavic
5765 */
5866public class LogbackLoggingSystem extends Slf4JLoggingSystem {
5967
@@ -124,6 +132,7 @@ protected void loadDefaults(LoggingInitializationContext initializationContext,
124132 LogFile logFile ) {
125133 LoggerContext context = getLoggerContext ();
126134 stopAndReset (context );
135+ registerJmxConfigurator (context , initializationContext , null , logFile );
127136 LogbackConfigurator configurator = new LogbackConfigurator (context );
128137 context .putProperty ("LOG_LEVEL_PATTERN" ,
129138 initializationContext .getEnvironment ().resolvePlaceholders (
@@ -139,6 +148,7 @@ protected void loadConfiguration(LoggingInitializationContext initializationCont
139148 super .loadConfiguration (initializationContext , location , logFile );
140149 LoggerContext loggerContext = getLoggerContext ();
141150 stopAndReset (loggerContext );
151+ registerJmxConfigurator (loggerContext , initializationContext , location , logFile );
142152 try {
143153 configureByResourceUrl (initializationContext , loggerContext ,
144154 ResourceUtils .getURL (location ));
@@ -190,6 +200,28 @@ private void addLevelChangePropagator(LoggerContext loggerContext) {
190200 loggerContext .addListener (levelChangePropagator );
191201 }
192202
203+ private void registerJmxConfigurator (LoggerContext loggerContext ,
204+ LoggingInitializationContext initializationContext , String configLocation ,
205+ LogFile logFile ) {
206+ String objectNameAsStr = MBeanUtil .getObjectNameFor (
207+ loggerContext .getName (), JMXConfigurator .class );
208+ ObjectName objectName = MBeanUtil .string2ObjectName (
209+ loggerContext , this , objectNameAsStr );
210+ MBeanServer mbs = ManagementFactory .getPlatformMBeanServer ();
211+ if (!MBeanUtil .isRegistered (mbs , objectName )) {
212+ LoggingSystemJMXConfigurator jmxConfigurator =
213+ new LoggingSystemJMXConfigurator (loggerContext , mbs , objectName ,
214+ initializationContext , configLocation , logFile );
215+ try {
216+ mbs .registerMBean (jmxConfigurator , objectName );
217+ }
218+ catch (Exception e ) {
219+ getLogger (LogbackLoggingSystem .class .getName ()).error (
220+ "Failed to create mbean" , e );
221+ }
222+ }
223+ }
224+
193225 @ Override
194226 public void cleanUp () {
195227 LoggerContext context = getLoggerContext ();
@@ -311,4 +343,34 @@ public void run() {
311343
312344 }
313345
346+ private class LoggingSystemJMXConfigurator extends JMXConfigurator {
347+
348+ private LoggingInitializationContext initializationContext ;
349+
350+ private String configLocation ;
351+
352+ private LogFile logFile ;
353+
354+ LoggingSystemJMXConfigurator (LoggerContext loggerContext , MBeanServer mbs ,
355+ ObjectName objectName , LoggingInitializationContext initializationContext ,
356+ String configLocation , LogFile logFile ) {
357+ super (loggerContext , mbs , objectName );
358+ this .initializationContext = initializationContext ;
359+ this .configLocation = configLocation ;
360+ this .logFile = logFile ;
361+ }
362+
363+ @ Override
364+ public void reloadDefaultConfiguration () throws JoranException {
365+ initialize (this .initializationContext , this .configLocation , this .logFile );
366+ }
367+
368+ @ Override
369+ public void reloadByFileName (String fileName )
370+ throws JoranException , FileNotFoundException {
371+ initialize (this .initializationContext , fileName , this .logFile );
372+ }
373+
374+ }
375+
314376}
0 commit comments