@@ -51,8 +51,7 @@ public abstract class AbstractLogService extends AbstractService implements
5151
5252 private int currentLevel = levelFromEnvironment ();
5353
54- private final Map <String , Integer > classAndPackageLevels =
55- new HashMap <>();
54+ private final Map <String , Integer > classAndPackageLevels ;
5655
5756 // -- constructor --
5857
@@ -61,43 +60,21 @@ public AbstractLogService() {
6160 }
6261
6362 public AbstractLogService (final Properties properties ) {
64- // check SciJava log level system properties for initial logging levels
65-
66- // global log level property
67- final String logProp = properties .getProperty (LOG_LEVEL_PROPERTY );
68- final int level = LogLevel .value (logProp );
69- if (level >= 0 ) setLevel (level );
70-
71- if (getLevel () == 0 )
72- setLevel (levelFromEnvironment ());
73-
74- // populate custom class- and package-specific log level properties
75- final String logLevelPrefix = LOG_LEVEL_PROPERTY + ":" ;
76- for (final Object propKey : properties .keySet ()) {
77- if (!(propKey instanceof String )) continue ;
78- final String propName = (String ) propKey ;
79- if (!propName .startsWith (logLevelPrefix )) continue ;
80- final String classOrPackageName =
81- propName .substring (logLevelPrefix .length ());
82- setLevel (classOrPackageName , LogLevel .value (properties .getProperty (propName )));
83- }
63+ // provide this constructor to enable unit tests
64+ final int level = LogLevel .value (properties .getProperty (
65+ LogService .LOG_LEVEL_PROPERTY ));
66+ if (level >= 0 ) currentLevel = level ;
67+ classAndPackageLevels = setupMapFromProperties (properties ,
68+ LogService .LOG_LEVEL_PROPERTY + ":" );
8469 }
8570
8671 // -- Logger methods --
8772
8873 @ Override
8974 public int getLevel () {
90- if (!classAndPackageLevels .isEmpty ()) {
91- // check for a custom log level for calling class or its parent packages
92- String classOrPackageName = CallingClassUtils .getCallingClass ().getName ();
93- while (classOrPackageName != null ) {
94- final Integer level = classAndPackageLevels .get (classOrPackageName );
95- if (level != null ) return level ;
96- classOrPackageName = parentPackage (classOrPackageName );
97- }
98- }
99- // no custom log level; return the global log level
100- return currentLevel ;
75+ if (classAndPackageLevels .isEmpty ()) return currentLevel ;
76+ return getLevelForClass (CallingClassUtils .getCallingClass ().getName (),
77+ currentLevel );
10178 }
10279
10380 @ Override
@@ -120,6 +97,16 @@ protected String getPrefix(final int level) {
12097
12198 // -- Helper methods --
12299
100+ private int getLevelForClass (String classOrPackageName , int defaultLevel ) {
101+ // check for a custom log level for calling class or its parent packages
102+ while (classOrPackageName != null ) {
103+ final Integer level = classAndPackageLevels .get (classOrPackageName );
104+ if (level != null ) return level ;
105+ classOrPackageName = parentPackage (classOrPackageName );
106+ }
107+ return defaultLevel ;
108+ }
109+
123110 private String parentPackage (final String classOrPackageName ) {
124111 final int dot = classOrPackageName .lastIndexOf ("." );
125112 if (dot < 0 ) return null ;
@@ -131,4 +118,15 @@ private int levelFromEnvironment() {
131118 return System .getenv ("DEBUG" ) == null ? LogLevel .INFO : LogLevel .DEBUG ;
132119 }
133120
121+ private Map <String , Integer > setupMapFromProperties (Properties properties ,
122+ String prefix )
123+ {
124+ final HashMap <String , Integer > map = new HashMap <>();
125+ for (final String propName : properties .stringPropertyNames ())
126+ if (propName .startsWith (prefix )) {
127+ final String key = propName .substring (prefix .length ());
128+ map .put (key , LogLevel .value (properties .getProperty (propName )));
129+ }
130+ return map ;
131+ }
134132}
0 commit comments