Initial commit
This commit is contained in:
621
src/main/java/net/locusworks/logger/ApplicationLogger.java
Normal file
621
src/main/java/net/locusworks/logger/ApplicationLogger.java
Normal file
@@ -0,0 +1,621 @@
|
||||
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 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:
|
||||
case DEBUG:
|
||||
case INFO:
|
||||
logger.info(format(message));
|
||||
break;
|
||||
case WARN:
|
||||
logger.warn(format(message));
|
||||
break;
|
||||
case ERROR:
|
||||
case FATAL:
|
||||
logger.error(format(message));
|
||||
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(s -> builder.append(s));
|
||||
|
||||
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 log 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) {
|
||||
return String.format("th%06d [%-5s] [%s] %s", Thread.currentThread().getId(), this.level.name(), this.name, message);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user