Initial commit

This commit is contained in:
Isaac Parenteau
2018-09-13 21:02:36 -05:00
commit a65c54ca80
14 changed files with 1202 additions and 0 deletions

View 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);
}
}