626 lines
16 KiB
Java
626 lines
16 KiB
Java
package net.locusworks.logger;
|
|
|
|
import java.util.Map;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.Marker;
|
|
|
|
/**
|
|
* Logger implementation to use across applications. Extends slf4j logger to work with other logging applications
|
|
* @author Isaac Parenteau
|
|
*
|
|
*/
|
|
public class ApplicationLogger implements org.slf4j.Logger {
|
|
|
|
protected static final String DEFAULT_FORMAT = "%s";
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(ApplicationLogger.class);
|
|
|
|
private final String name;
|
|
|
|
private LogLevel level;
|
|
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
protected ApplicationLogger() {
|
|
this(ApplicationLogger.class.getSimpleName());
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param name name of the logger
|
|
*/
|
|
protected ApplicationLogger(String name) {
|
|
this(name, LogLevel.INFO);
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param name name of the logger
|
|
* @param level level of logging to set the logger to
|
|
*/
|
|
protected ApplicationLogger(String name, LogLevel level) {
|
|
this.name = name;
|
|
this.level = level;
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param clazz java class to get the logger name from
|
|
*/
|
|
protected ApplicationLogger(Class<?> clazz) {
|
|
this(clazz.getSimpleName());
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param clazz java class to get the logger name from
|
|
* @param level level of logging to set the logger to
|
|
*/
|
|
protected ApplicationLogger(Class<?> clazz, LogLevel level) {
|
|
this(clazz.getSimpleName(), level);
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param clazz java class to get the logger name from
|
|
* @param simpleName use the simple class name (removes the package name and just uses the class name)
|
|
*/
|
|
protected ApplicationLogger(Class<?> clazz, boolean simpleName) {
|
|
this(simpleName ? clazz.getSimpleName(): clazz.getName());
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param clazz java class to get the logger name from
|
|
* @param simpleName use the simple class name (removes the package name and just uses the class name)
|
|
* @param level level of logging to set the logger to
|
|
*/
|
|
protected ApplicationLogger(Class<?> clazz, boolean simpleName, LogLevel level) {
|
|
this(simpleName ? clazz.getSimpleName(): clazz.getName(), level);
|
|
}
|
|
|
|
/**
|
|
* Get the current log level of the logger
|
|
* @return level
|
|
*/
|
|
public LogLevel getLogLevel() {
|
|
return this.level;
|
|
}
|
|
|
|
/**
|
|
* Set the log level of the logger
|
|
* @param logLevel the log level to set
|
|
*/
|
|
public void setLogLevel(LogLevel logLevel) {
|
|
this.level = logLevel;
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return this.name;
|
|
}
|
|
|
|
@Override
|
|
public boolean isTraceEnabled() {
|
|
return this.level.log(LogLevel.TRACE);
|
|
}
|
|
|
|
@Override
|
|
public void trace(String msg) {
|
|
trace(DEFAULT_FORMAT, msg);
|
|
}
|
|
|
|
@Override
|
|
public void trace(String format, Object arg) {
|
|
trace(format, new Object[] {arg});
|
|
}
|
|
|
|
@Override
|
|
public void trace(String format, Object arg1, Object arg2) {
|
|
trace(format, new Object[] {arg1, arg2});
|
|
}
|
|
|
|
@Override
|
|
public void trace(String format, Object... arguments) {
|
|
msgHelper(LogLevel.TRACE, format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void trace(String msg, Throwable t) {
|
|
trace("%s%n%s", msg, getStackTrace(t.getStackTrace()));
|
|
}
|
|
|
|
@Override
|
|
public boolean isTraceEnabled(Marker marker) {
|
|
return isTraceEnabled();
|
|
}
|
|
|
|
@Override
|
|
public void trace(Marker marker, String msg) {
|
|
trace(msg);
|
|
}
|
|
|
|
@Override
|
|
public void trace(Marker marker, String format, Object arg) {
|
|
trace(format, arg);
|
|
}
|
|
|
|
@Override
|
|
public void trace(Marker marker, String format, Object arg1, Object arg2) {
|
|
trace(format, arg1, arg2);
|
|
}
|
|
|
|
@Override
|
|
public void trace(Marker marker, String format, Object... argArray) {
|
|
trace(format, argArray);
|
|
}
|
|
|
|
@Override
|
|
public void trace(Marker marker, String msg, Throwable t) {
|
|
trace(msg, t);
|
|
}
|
|
|
|
@Override
|
|
public boolean isDebugEnabled() {
|
|
return this.level.log(LogLevel.DEBUG);
|
|
}
|
|
|
|
@Override
|
|
public void debug(String arg0) {
|
|
debug(DEFAULT_FORMAT, arg0);
|
|
}
|
|
|
|
@Override
|
|
public void debug(String format, Object arg) {
|
|
debug(format, new Object[] {arg});
|
|
}
|
|
|
|
@Override
|
|
public void debug(String format, Object arg1, Object arg2) {
|
|
debug(format, new Object[] {arg1, arg2});
|
|
}
|
|
|
|
@Override
|
|
public void debug(String format, Object... arguments) {
|
|
msgHelper(LogLevel.DEBUG, format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void debug(String msg, Throwable t) {
|
|
debug("%s%n%s", msg, getStackTrace(t.getStackTrace()));
|
|
}
|
|
|
|
@Override
|
|
public boolean isDebugEnabled(Marker marker) {
|
|
return isDebugEnabled();
|
|
}
|
|
|
|
@Override
|
|
public void debug(Marker marker, String msg) {
|
|
debug(msg);
|
|
}
|
|
|
|
@Override
|
|
public void debug(Marker marker, String format, Object arg) {
|
|
debug(format, arg);
|
|
}
|
|
|
|
@Override
|
|
public void debug(Marker marker, String format, Object arg1, Object arg2) {
|
|
debug(format, arg1, arg2);
|
|
}
|
|
|
|
@Override
|
|
public void debug(Marker marker, String format, Object... arguments) {
|
|
debug(format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void debug(Marker marker, String msg, Throwable t) {
|
|
debug(msg, t);
|
|
}
|
|
|
|
@Override
|
|
public boolean isInfoEnabled() {
|
|
return this.level.log(LogLevel.INFO);
|
|
}
|
|
|
|
@Override
|
|
public void info(String msg) {
|
|
info(DEFAULT_FORMAT, msg);
|
|
}
|
|
|
|
@Override
|
|
public void info(String format, Object arg) {
|
|
info(format, new Object[] {arg});
|
|
}
|
|
|
|
@Override
|
|
public void info(String format, Object arg1, Object arg2) {
|
|
info(format, new Object[] {arg1, arg2});
|
|
}
|
|
|
|
@Override
|
|
public void info(String format, Object... arguments) {
|
|
msgHelper(LogLevel.INFO, format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void info(String msg, Throwable t) {
|
|
info("%s%n%s", msg, getStackTrace(t.getStackTrace()));
|
|
}
|
|
|
|
/**
|
|
* Log an info message using values from a map in the format of
|
|
* key - value
|
|
* @param values Map containing values to log
|
|
*/
|
|
public void info(Map<String, String> values) {
|
|
info(values, null);
|
|
}
|
|
|
|
/**
|
|
* Log an info message using value from a map in the format of (key - value)
|
|
* @param values values to log
|
|
* @param sb a string builder to append the message to
|
|
*/
|
|
public void info(Map<String, String> values, StringBuilder sb) {
|
|
info(values, null, sb);
|
|
}
|
|
|
|
/**
|
|
* Log an info message using values from a map
|
|
* @param values Values to log
|
|
* @param valueFormat value format to use for the map
|
|
* @param sb String builder to append values to
|
|
*/
|
|
public void info(Map<String, String> values, String valueFormat, StringBuilder sb) {
|
|
msgHelper(LogLevel.INFO, values, valueFormat, sb);
|
|
}
|
|
|
|
@Override
|
|
public boolean isInfoEnabled(Marker marker) {
|
|
return isInfoEnabled();
|
|
}
|
|
|
|
@Override
|
|
public void info(Marker marker, String msg) {
|
|
info(msg);
|
|
}
|
|
|
|
@Override
|
|
public void info(Marker marker, String format, Object arg) {
|
|
info(format, arg);
|
|
}
|
|
|
|
@Override
|
|
public void info(Marker marker, String format, Object arg1, Object arg2) {
|
|
info(format, arg1, arg2);
|
|
}
|
|
|
|
@Override
|
|
public void info(Marker marker, String format, Object... arguments) {
|
|
info(format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void info(Marker marker, String msg, Throwable t) {
|
|
info(msg, t);
|
|
}
|
|
|
|
@Override
|
|
public boolean isWarnEnabled() {
|
|
return this.level.log(LogLevel.WARN);
|
|
}
|
|
|
|
@Override
|
|
public void warn(String msg) {
|
|
warn(DEFAULT_FORMAT, msg);
|
|
}
|
|
|
|
@Override
|
|
public void warn(String format, Object arg) {
|
|
warn(format, new Object[] {arg});
|
|
}
|
|
|
|
@Override
|
|
public void warn(String format, Object arg1, Object arg2) {
|
|
warn(format, new Object[] {arg1, arg2});
|
|
}
|
|
|
|
@Override
|
|
public void warn(String format, Object... arguments) {
|
|
msgHelper(LogLevel.WARN, format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void warn(String msg, Throwable t) {
|
|
warn("%s%n%s", msg, getStackTrace(t.getStackTrace()));
|
|
}
|
|
|
|
@Override
|
|
public boolean isWarnEnabled(Marker marker) {
|
|
return isWarnEnabled();
|
|
}
|
|
|
|
@Override
|
|
public void warn(Marker marker, String msg) {
|
|
warn(msg);
|
|
}
|
|
|
|
@Override
|
|
public void warn(Marker marker, String format, Object arg) {
|
|
warn(format, arg);
|
|
}
|
|
|
|
@Override
|
|
public void warn(Marker marker, String format, Object arg1, Object arg2) {
|
|
warn(format, arg1, arg2);
|
|
}
|
|
|
|
@Override
|
|
public void warn(Marker marker, String format, Object... arguments) {
|
|
warn(format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void warn(Marker marker, String msg, Throwable t) {
|
|
warn(msg, t);
|
|
}
|
|
|
|
/**
|
|
* Log a warning message using the string format method
|
|
* @param values values to log
|
|
*/
|
|
public void warn(Map<String, String> values) {
|
|
warn(values, null, null);
|
|
}
|
|
|
|
/**
|
|
* Log a warning message using values from a map
|
|
* @param values values to log
|
|
* @param sb String builder to append message to
|
|
*/
|
|
public void warn(Map<String, String> values, StringBuilder sb) {
|
|
warn(values, null, sb);
|
|
}
|
|
|
|
/**
|
|
* Log an error message using values from a map
|
|
* @param values values to log
|
|
* @param valueFormat format to use when logging the values
|
|
* @param sb string builder to append messages to
|
|
*/
|
|
public void warn(Map<String, String> values, String valueFormat, StringBuilder sb) {
|
|
msgHelper(LogLevel.WARN, values, valueFormat, sb);
|
|
}
|
|
|
|
@Override
|
|
public boolean isErrorEnabled() {
|
|
return this.level.log(LogLevel.ERROR);
|
|
}
|
|
|
|
@Override
|
|
public void error(String msg) {
|
|
error(DEFAULT_FORMAT, msg);
|
|
}
|
|
|
|
public void error(Throwable e) {
|
|
error(e.getMessage(), e);
|
|
}
|
|
|
|
@Override
|
|
public void error(String format, Object arg) {
|
|
error(format, new Object[] {arg});
|
|
}
|
|
|
|
@Override
|
|
public void error(String format, Object arg1, Object arg2) {
|
|
error(format, new Object[] {arg1, arg2});
|
|
}
|
|
|
|
@Override
|
|
public void error(String format, Object... arguments) {
|
|
msgHelper(LogLevel.ERROR, format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void error(String msg, Throwable t) {
|
|
error("%s%n%s", msg, getStackTrace(t.getStackTrace()));
|
|
}
|
|
|
|
/**
|
|
* Log an error message using values from a map
|
|
* @param values values to log
|
|
* @param sb String builder to append message to
|
|
*/
|
|
public void error(Map<String, String> values, StringBuilder sb) {
|
|
error(values, null, sb);
|
|
}
|
|
|
|
/**
|
|
* Log an error message using values from a map
|
|
* @param values values to log
|
|
* @param sb String builder to append message to
|
|
* @param e throwable error to log
|
|
*/
|
|
public void error(Map<String, String> values, StringBuilder sb, Throwable e) {
|
|
error(values, null, sb);
|
|
}
|
|
|
|
/**
|
|
* Log an error message using values from a map
|
|
* @param values values to log
|
|
* @param valueFormat format to use when logging the values
|
|
* @param sb string builder to append messages to
|
|
*/
|
|
public void error(Map<String, String> values, String valueFormat, StringBuilder sb) {
|
|
error(values, valueFormat, sb, null);
|
|
}
|
|
|
|
/**
|
|
* Log an error message using values from a map
|
|
* @param values values to log
|
|
* @param valueFormat format to use when logging the values
|
|
* @param sb string builder to append messages to
|
|
* @param e Throwable error to log
|
|
*/
|
|
public void error(Map<String, String> values, String valueFormat, StringBuilder sb, Throwable e) {
|
|
msgHelper(LogLevel.ERROR, values, valueFormat, sb);
|
|
if (e != null) {
|
|
msgHelper(LogLevel.ERROR,"", e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isErrorEnabled(Marker marker) {
|
|
return isErrorEnabled();
|
|
}
|
|
|
|
@Override
|
|
public void error(Marker marker, String msg) {
|
|
error(msg);
|
|
}
|
|
|
|
@Override
|
|
public void error(Marker marker, String format, Object arg) {
|
|
error(format, arg);
|
|
}
|
|
|
|
@Override
|
|
public void error(Marker marker, String format, Object arg1, Object arg2) {
|
|
error(format, arg1, arg2);
|
|
}
|
|
|
|
@Override
|
|
public void error(Marker marker, String format, Object... arguments) {
|
|
error(format, arguments);
|
|
}
|
|
|
|
@Override
|
|
public void error(Marker marker, String msg, Throwable t) {
|
|
error(msg, t);
|
|
}
|
|
|
|
/**
|
|
* Log the actual message
|
|
* @param level log level to use
|
|
* @param message message to log
|
|
*/
|
|
protected void log(LogLevel level, String message) {
|
|
if (level == null ||this.level == null || level.toInt() < this.level.toInt()) return;
|
|
|
|
switch (level) {
|
|
case ALL:
|
|
case TRACE:
|
|
logger.trace(format(message, level));
|
|
break;
|
|
case DEBUG:
|
|
logger.debug(format(message, level));
|
|
break;
|
|
case INFO:
|
|
logger.info(format(message, level));
|
|
break;
|
|
case WARN:
|
|
logger.warn(format(message, level));
|
|
break;
|
|
case ERROR:
|
|
case FATAL:
|
|
logger.error(format(message, level));
|
|
break;
|
|
case OFF:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Print the exception stack trace to a string
|
|
* @param e Exception to print the stack trace
|
|
* @return string representation of the stack trace
|
|
*/
|
|
protected String getStackTrace(Throwable e) {
|
|
return getStackTrace(e.getStackTrace());
|
|
}
|
|
|
|
/**
|
|
* Print the exception stack trace to a string
|
|
* @param elements stack trace elements to print to the string
|
|
* @return string representation of the stack trace
|
|
*/
|
|
protected String getStackTrace(StackTraceElement[] elements) {
|
|
StringBuilder sb = new StringBuilder();
|
|
for (StackTraceElement element : elements) {
|
|
sb.append(String.format("%s%n",element.toString()));;
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
/**
|
|
* Message helper to help format the message for logging
|
|
* @param level The log level
|
|
* @param values Map values to log
|
|
* @param valueFormat value format to map values as
|
|
* @param sb String builder to append messages to
|
|
*/
|
|
private void msgHelper(LogLevel level, Map<String, String> values, String valueFormat, StringBuilder sb) {
|
|
|
|
if (sb == null) {
|
|
sb = new StringBuilder();
|
|
}
|
|
|
|
if (valueFormat == null || valueFormat.trim().isEmpty()) {
|
|
int longest = 0;
|
|
for (String key : values.keySet()) {
|
|
if (key.length() > longest) {
|
|
longest = key.length();
|
|
}
|
|
}
|
|
valueFormat = "%n%-" + longest + "s: %s";
|
|
}
|
|
|
|
final String format = valueFormat;
|
|
|
|
final StringBuilder builder = sb;
|
|
values.entrySet()
|
|
.stream()
|
|
.map(entry -> String.format(format, entry.getKey(), entry.getValue()))
|
|
.forEach(builder::append);
|
|
|
|
log(level, builder.toString());
|
|
}
|
|
|
|
/**
|
|
* Help format a message for logging
|
|
* @param level the log level
|
|
* @param format The string format to use
|
|
* @param args Arguments to use in the string format
|
|
*/
|
|
private void msgHelper(LogLevel level, String format, Object...args) {
|
|
log(level, String.format(format, args));
|
|
}
|
|
|
|
/**
|
|
* helper method to format a message for logging
|
|
* @param level level to use
|
|
* @param message message to log
|
|
* @param e any throwable to log
|
|
*/
|
|
private void msgHelper(LogLevel level, String message, Throwable e) {
|
|
String msg = e == null ? String.format("%n%s", message) : String.format("%n%s%n%s%n%s", message, e.getMessage(), getStackTrace(e));
|
|
log(level, msg);
|
|
}
|
|
|
|
/**
|
|
* Message format to be used for logging
|
|
* @param message the message to log
|
|
* @return the formatted string
|
|
*/
|
|
private String format(String message, LogLevel level) {
|
|
return String.format("th%06d [%-5s] [%s] %s", Thread.currentThread().getId(), level, this.name, message);
|
|
}
|
|
}
|