OverviewMinLog is a Java logging library. Key features:
Low overhead Logging statements below a given level can be automatically removed by javac at compile time. Simple and efficient The API is concise and very efficient at runtime. Extremely lightweight The entire project consists of one Java
... [More]
file with just over 100 non-comment lines of code. The JAR is 2.6kb (2kb with pack200). UsageMessages are logged using static methods:
Log.info("Some message.");
Log.debug("Error reading file: " + file, ex);A static import can be used to make the logging more concise:
import static com.esotericsoftware.minlog.Log.*;
// ...
info("Some message.");
debug("Error reading file: " + file, ex);While optional, for brevity the rest of this documentation assumes this static import is in place.
If log statements from different libraries or areas of an application need to be differentiated, a category can be specified:
info("some lib", "Some message.");
debug("some lib", "Error reading file: " + file, ex);Log levelSetting the level will log that level, as well as all higher levels:
Log.set(LEVEL_INFO);The levels are:
LEVEL_NONE disables all logging. LEVEL_ERROR is for critical errors. The application may no longer work correctly. LEVEL_WARN is for important warnings. The application will continue to work correctly. LEVEL_INFO is for informative messages. Typically used for deployment. LEVEL_DEBUG is for debug messages. This level is useful during development. LEVEL_TRACE is for trace messages. A lot of information is logged, so this level is usually only needed when debugging a problem. Conditional loggingThe current log level can be checked before the message is logged:
if (ERROR) error("Error reading file: " + file, ex);
if (TRACE) {
StringBuilder builder = new StringBuilder();
// Do work, append to the builder.
trace(builder);
}Checking the log level before calling the logging method is optional, but prevents unnecessary method calls and string concatenation for log levels that are disabled.
Fixed logging levelsMinLog users can choose from the regular "minlog.jar" or from from a JAR file like "minlog-info.jar" which has a fixed logging level that cannot be changed at runtime (calls to Log.set() have no affect). During compilation, any conditional logging statements below the fixed level will be automatically optimized away by the Java compiler.
Please see OverheadAndComparisons for more about the overhead when using MinLog with/without conditional logging and with/without a fixed logging level. The document also compares the MinLog overhead with log4j and java.util.logging.
Output customizationThe default logger outputs messages in this format:
time level: [category] messageWhere "time" is the time elapsed since the application started. For example:
00:00 TRACE: [kryo] Wrote string: moo
00:00 TRACE: [kryo] Wrote object: NonNullTestClass
00:01 TRACE: [kryo] Wrote string: this is some data
00:01 TRACE: [kryo] Compressed to 7.97% using: DeflateCompressor
00:12 TRACE: [kryo] Decompressed using: DeflateCompressor
00:12 TRACE: [kryo] Read string: this is some dataThe output can be customized:
static public class MyLogger extends Logger {
public void log (int level, String category, String message, Throwable ex) {
StringBuilder builder = new StringBuilder(256);
builder.append(new Date());
builder.append(' ');
builder.append(level);
builder.append('[');
builder.append(category);
builder.append("] ");
builder.append(message);
if (ex != null) {
StringWriter writer = new StringWriter(256);
ex.printStackTrace(new PrintWriter(writer));
builder.append('\n');
builder.append(writer.toString().trim());
}
System.out.println(builder);
}
}
// ...
Log.set(new MyLogger());Using this mechanism, log messages can be filtered (eg, by category), written to a file, etc. [Less]