Skip to content

Commit 7dfcea0

Browse files
committed
Merge branch 'log-levels'
This adds a new LogLevel class which houses log-level-related functionality, including the log level constants.
2 parents 1196466 + 4af17fb commit 7dfcea0

File tree

6 files changed

+233
-94
lines changed

6 files changed

+233
-94
lines changed

src/main/java/org/scijava/log/AbstractLogService.java

Lines changed: 37 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -71,26 +71,29 @@ public abstract class AbstractLogService extends AbstractService implements
7171
// -- constructor --
7272

7373
public AbstractLogService() {
74+
this(System.getProperties());
75+
}
76+
77+
public AbstractLogService(final Properties properties) {
7478
// check SciJava log level system properties for initial logging levels
7579

7680
// global log level property
77-
final String logProp = System.getProperty(LOG_LEVEL_PROPERTY);
78-
final int level = level(logProp);
81+
final String logProp = properties.getProperty(LOG_LEVEL_PROPERTY);
82+
final int level = LogLevel.value(logProp);
7983
if (level >= 0) setLevel(level);
8084

8185
if (getLevel() == 0)
8286
setLevel(levelFromEnvironment());
8387

8488
// populate custom class- and package-specific log level properties
8589
final String logLevelPrefix = LOG_LEVEL_PROPERTY + ":";
86-
final Properties props = System.getProperties();
87-
for (final Object propKey : props.keySet()) {
90+
for (final Object propKey : properties.keySet()) {
8891
if (!(propKey instanceof String)) continue;
8992
final String propName = (String) propKey;
9093
if (!propName.startsWith(logLevelPrefix)) continue;
9194
final String classOrPackageName =
9295
propName.substring(logLevelPrefix.length());
93-
setLevel(classOrPackageName, level(props.getProperty(propName)));
96+
setLevel(classOrPackageName, LogLevel.value(properties.getProperty(propName)));
9497
}
9598

9699
}
@@ -107,127 +110,110 @@ protected void log(final int level, final Object msg, final Throwable t) {
107110
}
108111

109112
protected void log(final int level, final Object msg) {
110-
final String prefix = getPrefix(level);
113+
final String prefix = LogLevel.prefix(level);
111114
log((prefix == null ? "" : prefix + " ") + msg);
112115
}
113116

114-
protected String getPrefix(final int level) {
115-
switch (level) {
116-
case ERROR:
117-
return "[ERROR]";
118-
case WARN:
119-
return "[WARNING]";
120-
case INFO:
121-
return "[INFO]";
122-
case DEBUG:
123-
return "[DEBUG]";
124-
case TRACE:
125-
return "[TRACE]";
126-
default:
127-
return null;
128-
}
129-
}
130-
131117
// -- LogService methods --
132118

133119
@Override
134120
public void debug(final Object msg) {
135-
log(DEBUG, msg, null);
121+
log(LogLevel.DEBUG, msg, null);
136122
}
137123

138124
@Override
139125
public void debug(final Throwable t) {
140-
log(DEBUG, null, t);
126+
log(LogLevel.DEBUG, null, t);
141127
}
142128

143129
@Override
144130
public void debug(final Object msg, final Throwable t) {
145-
log(DEBUG, msg, t);
131+
log(LogLevel.DEBUG, msg, t);
146132
}
147133

148134
@Override
149135
public void error(final Object msg) {
150-
log(ERROR, msg, null);
136+
log(LogLevel.ERROR, msg, null);
151137
}
152138

153139
@Override
154140
public void error(final Throwable t) {
155-
log(ERROR, null, t);
141+
log(LogLevel.ERROR, null, t);
156142
}
157143

158144
@Override
159145
public void error(final Object msg, final Throwable t) {
160-
log(ERROR, msg, t);
146+
log(LogLevel.ERROR, msg, t);
161147
}
162148

163149
@Override
164150
public void info(final Object msg) {
165-
log(INFO, msg, null);
151+
log(LogLevel.INFO, msg, null);
166152
}
167153

168154
@Override
169155
public void info(final Throwable t) {
170-
log(INFO, null, t);
156+
log(LogLevel.INFO, null, t);
171157
}
172158

173159
@Override
174160
public void info(final Object msg, final Throwable t) {
175-
log(INFO, msg, t);
161+
log(LogLevel.INFO, msg, t);
176162
}
177163

178164
@Override
179165
public void trace(final Object msg) {
180-
log(TRACE, msg, null);
166+
log(LogLevel.TRACE, msg, null);
181167
}
182168

183169
@Override
184170
public void trace(final Throwable t) {
185-
log(TRACE, null, t);
171+
log(LogLevel.TRACE, null, t);
186172
}
187173

188174
@Override
189175
public void trace(final Object msg, final Throwable t) {
190-
log(TRACE, msg, t);
176+
log(LogLevel.TRACE, msg, t);
191177
}
192178

193179
@Override
194180
public void warn(final Object msg) {
195-
log(WARN, msg, null);
181+
log(LogLevel.WARN, msg, null);
196182
}
197183

198184
@Override
199185
public void warn(final Throwable t) {
200-
log(WARN, null, t);
186+
log(LogLevel.WARN, null, t);
201187
}
202188

203189
@Override
204190
public void warn(final Object msg, final Throwable t) {
205-
log(WARN, msg, t);
191+
log(LogLevel.WARN, msg, t);
206192
}
207193

208194
@Override
209195
public boolean isDebug() {
210-
return getLevel() >= DEBUG;
196+
return getLevel() >= LogLevel.DEBUG;
211197
}
212198

213199
@Override
214200
public boolean isError() {
215-
return getLevel() >= ERROR;
201+
return getLevel() >= LogLevel.ERROR;
216202
}
217203

218204
@Override
219205
public boolean isInfo() {
220-
return getLevel() >= INFO;
206+
return getLevel() >= LogLevel.INFO;
221207
}
222208

223209
@Override
224210
public boolean isTrace() {
225-
return getLevel() >= TRACE;
211+
return getLevel() >= LogLevel.TRACE;
226212
}
227213

228214
@Override
229215
public boolean isWarn() {
230-
return getLevel() >= WARN;
216+
return getLevel() >= LogLevel.WARN;
231217
}
232218

233219
@Override
@@ -255,31 +241,16 @@ public void setLevel(final String classOrPackageName, final int level) {
255241
classAndPackageLevels.put(classOrPackageName, level);
256242
}
257243

258-
// -- Helper methods --
244+
// -- Deprecated --
259245

260-
/** Extracts the log level value from a string. */
261-
private int level(final String logProp) {
262-
if (logProp == null) return -1;
263-
264-
// check whether it's a string label (e.g., "debug")
265-
final String log = logProp.trim().toLowerCase();
266-
if (log.startsWith("n")) return NONE;
267-
if (log.startsWith("e")) return ERROR;
268-
if (log.startsWith("w")) return WARN;
269-
if (log.startsWith("i")) return INFO;
270-
if (log.startsWith("d")) return DEBUG;
271-
if (log.startsWith("t")) return TRACE;
272-
273-
// check whether it's a numerical value (e.g., 5)
274-
try {
275-
return Integer.parseInt(log);
276-
}
277-
catch (final NumberFormatException exc) {
278-
// nope!
279-
}
280-
return -1;
246+
/** @deprecated Use {@link LogLevel#prefix(int)} instead. */
247+
@Deprecated
248+
protected String getPrefix(final int level) {
249+
return "[" + LogLevel.prefix(level) + "]";
281250
}
282251

252+
// -- Helper methods --
253+
283254
private String callingClass() {
284255
final String thisClass = AbstractLogService.class.getName();
285256
for (final StackTraceElement element : new Exception().getStackTrace()) {
@@ -298,7 +269,7 @@ private String parentPackage(final String classOrPackageName) {
298269

299270
private int levelFromEnvironment() {
300271
// use the default, which is INFO unless the DEBUG env. variable is set
301-
return System.getenv("DEBUG") == null ? INFO : DEBUG;
272+
return System.getenv("DEBUG") == null ? LogLevel.INFO : LogLevel.DEBUG;
302273
}
303274

304275
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* #%L
3+
* SciJava Common shared library for SciJava software.
4+
* %%
5+
* Copyright (C) 2009 - 2017 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
7+
* Institute of Molecular Cell Biology and Genetics.
8+
* %%
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1. Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
* 2. Redistributions in binary form must reproduce the above copyright notice,
15+
* this list of conditions and the following disclaimer in the documentation
16+
* and/or other materials provided with the distribution.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
* POSSIBILITY OF SUCH DAMAGE.
29+
* #L%
30+
*/
31+
32+
package org.scijava.log;
33+
34+
/**
35+
* Constants for specifying a logger's level of verbosity.
36+
*
37+
* @author Curtis Rueden
38+
*/
39+
public final class LogLevel {
40+
41+
private LogLevel() {
42+
// prevent instantiation of utility class
43+
}
44+
45+
public static final int NONE = 0;
46+
public static final int ERROR = 1;
47+
public static final int WARN = 2;
48+
public static final int INFO = 3;
49+
public static final int DEBUG = 4;
50+
public static final int TRACE = 5;
51+
52+
public static String prefix(final int level) {
53+
switch (level) {
54+
case ERROR:
55+
return "ERROR";
56+
case WARN:
57+
return "WARNING";
58+
case INFO:
59+
return "INFO";
60+
case DEBUG:
61+
return "DEBUG";
62+
case TRACE:
63+
return "TRACE";
64+
default:
65+
return "LEVEL" + level;
66+
}
67+
}
68+
69+
/**
70+
* Extracts the log level value from a string.
71+
*
72+
* @return The log level, or -1 if the level cannot be parsed.
73+
*/
74+
public static int value(final String s) {
75+
if (s == null) return -1;
76+
77+
// check whether it's a string label (e.g., "debug")
78+
final String log = s.trim().toLowerCase();
79+
if (log.startsWith("n")) return LogLevel.NONE;
80+
if (log.startsWith("e")) return LogLevel.ERROR;
81+
if (log.startsWith("w")) return LogLevel.WARN;
82+
if (log.startsWith("i")) return LogLevel.INFO;
83+
if (log.startsWith("d")) return LogLevel.DEBUG;
84+
if (log.startsWith("t")) return LogLevel.TRACE;
85+
86+
// check whether it's a numerical value (e.g., 5)
87+
try {
88+
return Integer.parseInt(log);
89+
}
90+
catch (final NumberFormatException exc) {
91+
// nope!
92+
}
93+
return -1;
94+
}
95+
96+
}

src/main/java/org/scijava/log/LogService.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,26 @@ public interface LogService extends SciJavaService {
5050
/** System property to set for overriding the default logging level. */
5151
String LOG_LEVEL_PROPERTY = "scijava.log.level";
5252

53-
int NONE = 0;
54-
int ERROR = 1;
55-
int WARN = 2;
56-
int INFO = 3;
57-
int DEBUG = 4;
58-
int TRACE = 5;
53+
// -- Deprecated --
54+
55+
/** @deprecated Use {@link LogLevel#NONE}. */
56+
@Deprecated
57+
int NONE = LogLevel.NONE;
58+
/** @deprecated Use {@link LogLevel#ERROR}. */
59+
@Deprecated
60+
int ERROR = LogLevel.ERROR;
61+
/** @deprecated Use {@link LogLevel#WARN}. */
62+
@Deprecated
63+
int WARN = LogLevel.WARN;
64+
/** @deprecated Use {@link LogLevel#INFO}. */
65+
@Deprecated
66+
int INFO = LogLevel.INFO;
67+
/** @deprecated Use {@link LogLevel#DEBUG}. */
68+
@Deprecated
69+
int DEBUG = LogLevel.DEBUG;
70+
/** @deprecated Use {@link LogLevel#TRACE}. */
71+
@Deprecated
72+
int TRACE = LogLevel.TRACE;
5973

6074
void debug(Object msg);
6175

src/main/java/org/scijava/log/StderrLogService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ public class StderrLogService extends AbstractLogService {
5252

5353
@Override
5454
protected void log(final int level, final Object msg) {
55-
final String prefix = getPrefix(level);
55+
final String prefix = LogLevel.prefix(level);
5656
final String message = (prefix == null ? "" : prefix + " ") + msg;
5757
// NB: Emit severe messages to stderr, and less severe ones to stdout.
58-
if (level <= WARN) System.err.println(message);
58+
if (level <= LogLevel.WARN) System.err.println(message);
5959
else System.out.println(message);
6060
}
6161

0 commit comments

Comments
 (0)