2020import java .io .InputStream ;
2121import java .net .URL ;
2222import java .util .ArrayList ;
23- import java .util .Collection ;
2423import java .util .Collections ;
2524import java .util .LinkedHashMap ;
2625import java .util .List ;
3433import org .apache .logging .log4j .core .LogEvent ;
3534import org .apache .logging .log4j .core .Logger ;
3635import org .apache .logging .log4j .core .LoggerContext ;
36+ import org .apache .logging .log4j .core .config .AbstractConfiguration ;
37+ import org .apache .logging .log4j .core .config .Configuration ;
3738import org .apache .logging .log4j .core .config .ConfigurationFactory ;
3839import org .apache .logging .log4j .core .config .ConfigurationSource ;
3940import org .apache .logging .log4j .core .config .LoggerConfig ;
@@ -211,68 +212,59 @@ public Set<LogLevel> getSupportedLogLevels() {
211212 @ Override
212213 public void setLogLevel (String loggerName , LogLevel logLevel ) {
213214 Level level = LEVELS .convertSystemToNative (logLevel );
214- LoggerConfig loggerConfig = getLoggerConfig (loggerName );
215- if (loggerConfig == null ) {
216- loggerConfig = new LoggerConfig (loggerName , level , true );
217- getLoggerContext ().getConfiguration ().addLogger (loggerName , loggerConfig );
215+ LoggerConfig logger = getLogger (loggerName );
216+ if (logger == null ) {
217+ logger = new LoggerConfig (loggerName , level , true );
218+ getLoggerContext ().getConfiguration ().addLogger (loggerName , logger );
218219 }
219220 else {
220- loggerConfig .setLevel (level );
221+ logger .setLevel (level );
221222 }
222223 getLoggerContext ().updateLoggers ();
223224 }
224225
225226 @ Override
226227 public List <LoggerConfiguration > getLoggerConfigurations () {
227- Map <String , LoggerConfig > allLoggers = getAllLoggers ();
228228 List <LoggerConfiguration > result = new ArrayList <>();
229- allLoggers .forEach ((key , value ) -> result .add (convertLoggerConfiguration ( value , key )));
229+ getAllLoggers () .forEach ((name , loggerConfig ) -> result .add (convertLoggerConfig ( name , loggerConfig )));
230230 result .sort (CONFIGURATION_COMPARATOR );
231231 return result ;
232232 }
233233
234+ @ Override
235+ public LoggerConfiguration getLoggerConfiguration (String loggerName ) {
236+ LoggerConfig loggerConfig = getAllLoggers ().get (loggerName );
237+ return (loggerConfig != null ) ? convertLoggerConfig (loggerName , loggerConfig ) : null ;
238+ }
239+
234240 private Map <String , LoggerConfig > getAllLoggers () {
235- Collection <Logger > loggers = getLoggerContext ().getLoggers ();
236- Map <String , LoggerConfig > configuredLoggers = getLoggerContext ().getConfiguration ().getLoggers ();
237- Map <String , LoggerConfig > result = new LinkedHashMap <>();
238- for (Logger logger : loggers ) {
239- String name = logger .getName ();
240- while (name != null ) {
241- result .putIfAbsent (name , getLoggerContext ().getConfiguration ().getLoggerConfig (name ));
242- name = getSubName (name );
243- }
241+ Map <String , LoggerConfig > loggers = new LinkedHashMap <>();
242+ for (Logger logger : getLoggerContext ().getLoggers ()) {
243+ addLogger (loggers , logger .getName ());
244244 }
245- configuredLoggers .keySet ().forEach ((name ) -> {
246- String currentName = name ;
247- while (currentName != null ) {
248- result .putIfAbsent (currentName , getLoggerContext ().getConfiguration ().getLoggerConfig (currentName ));
249- currentName = getSubName (currentName );
250- }
245+ getLoggerContext ().getConfiguration ().getLoggers ().keySet ().forEach ((name ) -> {
246+ addLogger (loggers , name );
251247 });
252- return result ;
248+ return loggers ;
253249 }
254250
255- private String getSubName (String name ) {
256- if (StringUtils .isEmpty (name )) {
257- return null ;
251+ private void addLogger (Map <String , LoggerConfig > loggers , String name ) {
252+ Configuration configuration = getLoggerContext ().getConfiguration ();
253+ while (name != null ) {
254+ loggers .computeIfAbsent (name , configuration ::getLoggerConfig );
255+ name = getSubName (name );
258256 }
259- int nested = name .lastIndexOf ('$' );
260- if (nested != -1 ) {
261- return name .substring (0 , nested );
262- }
263- return NameUtil .getSubName (name );
264257 }
265258
266- @ Override
267- public LoggerConfiguration getLoggerConfiguration (String loggerName ) {
268- LoggerConfig loggerConfig = getAllLoggers ().get (loggerName );
269- if (loggerConfig == null ) {
259+ private String getSubName (String name ) {
260+ if (StringUtils .isEmpty (name )) {
270261 return null ;
271262 }
272- return convertLoggerConfiguration (loggerConfig , loggerName );
263+ int nested = name .lastIndexOf ('$' );
264+ return (nested != -1 ) ? name .substring (0 , nested ) : NameUtil .getSubName (name );
273265 }
274266
275- private LoggerConfiguration convertLoggerConfiguration ( LoggerConfig loggerConfig , String name ) {
267+ private LoggerConfiguration convertLoggerConfig ( String name , LoggerConfig loggerConfig ) {
276268 if (loggerConfig == null ) {
277269 return null ;
278270 }
@@ -298,11 +290,17 @@ public void cleanUp() {
298290 loggerContext .getConfiguration ().removeFilter (FILTER );
299291 }
300292
301- private LoggerConfig getLoggerConfig (String name ) {
302- if (!StringUtils .hasLength (name ) || ROOT_LOGGER_NAME .equals (name )) {
303- name = LogManager .ROOT_LOGGER_NAME ;
293+ private LoggerConfig getLogger (String name ) {
294+ boolean isRootLogger = !StringUtils .hasLength (name ) || ROOT_LOGGER_NAME .equals (name );
295+ return findLogger (isRootLogger ? LogManager .ROOT_LOGGER_NAME : name );
296+ }
297+
298+ private LoggerConfig findLogger (String name ) {
299+ Configuration configuration = getLoggerContext ().getConfiguration ();
300+ if (configuration instanceof AbstractConfiguration ) {
301+ return ((AbstractConfiguration ) configuration ).getLogger (name );
304302 }
305- return getLoggerContext (). getConfiguration () .getLoggers ().get (name );
303+ return configuration .getLoggers ().get (name );
306304 }
307305
308306 private LoggerContext getLoggerContext () {
0 commit comments