/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Other licenses:
* -----------------------------------------------------------------------------
* Commercial licenses for this work are available. These replace the above
* ASL 2.0 and offer limited warranties, support, maintenance, and commercial
* database integrations.
*
* For more information, please visit: http://www.jooq.org/licenses
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package org.jooq.tools;
import org.jooq.Log;
The jOOQ logger abstraction.
This logger provides abstraction over the three logger APIs supported
optionally by jOOQ. These are (in order of preference):
- slf4j
- log4j
- jav.util.logging
JooqLogger
tries to instantiate any of the above loggers, catching potential NoClassDefFoundError
's in case any logger API cannot be found on the classpath. Author: Lukas Eder
/**
* The jOOQ logger abstraction.
* <p>
* This logger provides abstraction over the three logger APIs supported
* optionally by jOOQ. These are (in order of preference):
* <ul>
* <li>slf4j</li>
* <li>log4j</li>
* <li>jav.util.logging</li>
* </ul>
* <code>JooqLogger</code> tries to instantiate any of the above loggers,
* catching potential {@link NoClassDefFoundError}'s in case any logger API
* cannot be found on the classpath.
*
* @author Lukas Eder
*/
public final class JooqLogger implements Log {
The global logger threshold.
/**
* The global logger threshold.
*/
private static volatile Log.Level globalThreshold = Log.Level.TRACE;
The SLF4j Logger instance, if available.
/**
* The SLF4j Logger instance, if available.
*/
private org.slf4j.Logger slf4j;
The JDK Logger instance, if available.
/**
* The JDK Logger instance, if available.
*/
private java.util.logging.Logger util;
Whether calls to trace(Object)
are possible. /**
* Whether calls to {@link #trace(Object)} are possible.
*/
private boolean supportsTrace = true;
Whether calls to debug(Object)
are possible. /**
* Whether calls to {@link #debug(Object)} are possible.
*/
private boolean supportsDebug = true;
Whether calls to info(Object)
are possible. /**
* Whether calls to {@link #info(Object)} are possible.
*/
private boolean supportsInfo = true;
Get a logger wrapper for a class.
/**
* Get a logger wrapper for a class.
*/
public static JooqLogger getLogger(Class<?> clazz) {
JooqLogger result = new JooqLogger();
// Prioritise slf4j
try {
result.slf4j = org.slf4j.LoggerFactory.getLogger(clazz);
}
// If that's not on the classpath, log using the JDK logger
catch (Throwable e2) {
result.util = java.util.logging.Logger.getLogger(clazz.getName());
}
// [#2085] Check if any of the INFO, DEBUG, TRACE levels might be
// unavailable, e.g. because client code isn't using the latest version
// of log4j or any other logger
try {
result.isInfoEnabled();
}
catch (Throwable e) {
result.supportsInfo = false;
}
try {
result.isDebugEnabled();
}
catch (Throwable e) {
result.supportsDebug = false;
}
try {
result.isTraceEnabled();
}
catch (Throwable e) {
result.supportsTrace = false;
}
return result;
}
Check if TRACE
level logging is enabled.
/**
* Check if <code>TRACE</code> level logging is enabled.
*/
@Override
public boolean isTraceEnabled() {
if (!globalThreshold.supports(Log.Level.TRACE))
return false;
else if (!supportsTrace)
return false;
else if (slf4j != null)
return slf4j.isTraceEnabled();
else
return util.isLoggable(java.util.logging.Level.FINER);
}
Log a message in TRACE
level.
Params: - message – The log message
/**
* Log a message in <code>TRACE</code> level.
*
* @param message The log message
*/
@Override
public void trace(Object message) {
trace(message, (Object) null);
}
Log a message in TRACE
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
/**
* Log a message in <code>TRACE</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
*/
@Override
public void trace(Object message, Object details) {
if (!globalThreshold.supports(Log.Level.TRACE))
return;
else if (slf4j != null)
slf4j.trace(getMessage(message, details));
else
util.finer("" + getMessage(message, details));
}
Log a message in TRACE
level.
Params: - message – The log message
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>TRACE</code> level.
*
* @param message The log message
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void trace(Object message, Throwable throwable) {
trace(message, null, throwable);
}
Log a message in TRACE
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>TRACE</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void trace(Object message, Object details, Throwable throwable) {
if (!globalThreshold.supports(Log.Level.TRACE))
return;
else if (slf4j != null)
slf4j.trace(getMessage(message, details), throwable);
else
util.log(java.util.logging.Level.FINER, "" + getMessage(message, details), throwable);
}
Check if DEBUG
level logging is enabled.
/**
* Check if <code>DEBUG</code> level logging is enabled.
*/
@Override
public boolean isDebugEnabled() {
if (!globalThreshold.supports(Log.Level.DEBUG))
return false;
else if (!supportsDebug)
return false;
else if (slf4j != null)
return slf4j.isDebugEnabled();
else
return util.isLoggable(java.util.logging.Level.FINE);
}
Log a message in DEBUG
level.
Params: - message – The log message
/**
* Log a message in <code>DEBUG</code> level.
*
* @param message The log message
*/
@Override
public void debug(Object message) {
debug(message, (Object) null);
}
Log a message in DEBUG
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
/**
* Log a message in <code>DEBUG</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
*/
@Override
public void debug(Object message, Object details) {
if (!globalThreshold.supports(Log.Level.DEBUG))
return;
else if (slf4j != null)
slf4j.debug(getMessage(message, details));
else
util.fine("" + getMessage(message, details));
}
Log a message in DEBUG
level.
Params: - message – The log message
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>DEBUG</code> level.
*
* @param message The log message
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void debug(Object message, Throwable throwable) {
debug(message, null, throwable);
}
Log a message in DEBUG
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>DEBUG</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void debug(Object message, Object details, Throwable throwable) {
if (!globalThreshold.supports(Log.Level.DEBUG))
return;
else if (slf4j != null)
slf4j.debug(getMessage(message, details), throwable);
else
util.log(java.util.logging.Level.FINE, "" + getMessage(message, details), throwable);
}
Check if INFO
level logging is enabled.
/**
* Check if <code>INFO</code> level logging is enabled.
*/
@Override
public boolean isInfoEnabled() {
if (!globalThreshold.supports(Log.Level.INFO))
return false;
if (!supportsInfo)
return false;
else if (slf4j != null)
return slf4j.isInfoEnabled();
else
return util.isLoggable(java.util.logging.Level.INFO);
}
Log a message in INFO
level.
Params: - message – The log message
/**
* Log a message in <code>INFO</code> level.
*
* @param message The log message
*/
@Override
public void info(Object message) {
info(message, (Object) null);
}
Log a message in INFO
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
/**
* Log a message in <code>INFO</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
*/
@Override
public void info(Object message, Object details) {
if (!globalThreshold.supports(Log.Level.INFO))
return;
else if (slf4j != null)
slf4j.info(getMessage(message, details));
else
util.info("" + getMessage(message, details));
}
Log a message in INFO
level.
Params: - message – The log message
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>INFO</code> level.
*
* @param message The log message
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void info(Object message, Throwable throwable) {
info(message, null, throwable);
}
Log a message in INFO
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>INFO</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void info(Object message, Object details, Throwable throwable) {
if (!globalThreshold.supports(Log.Level.INFO))
return;
else if (slf4j != null)
slf4j.info(getMessage(message, details), throwable);
else
util.log(java.util.logging.Level.INFO, "" + getMessage(message, details), throwable);
}
Log a message in WARN
level.
Params: - message – The log message
/**
* Log a message in <code>WARN</code> level.
*
* @param message The log message
*/
@Override
public void warn(Object message) {
warn(message, (Object) null);
}
Log a message in WARN
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
/**
* Log a message in <code>WARN</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
*/
@Override
public void warn(Object message, Object details) {
if (!globalThreshold.supports(Log.Level.WARN))
return;
else if (slf4j != null)
slf4j.warn(getMessage(message, details));
else
util.warning("" + getMessage(message, details));
}
Log a message in WARN
level.
Params: - message – The log message
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>WARN</code> level.
*
* @param message The log message
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void warn(Object message, Throwable throwable) {
warn(message, null, throwable);
}
Log a message in WARN
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>WARN</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void warn(Object message, Object details, Throwable throwable) {
if (!globalThreshold.supports(Log.Level.WARN))
return;
else if (slf4j != null)
slf4j.warn(getMessage(message, details), throwable);
else
util.log(java.util.logging.Level.WARNING, "" + getMessage(message, details), throwable);
}
Log a message in ERROR
level.
Params: - message – The log message
/**
* Log a message in <code>ERROR</code> level.
*
* @param message The log message
*/
@Override
public void error(Object message) {
error(message, (Object) null);
}
Log a message in ERROR
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
/**
* Log a message in <code>ERROR</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
*/
@Override
public void error(Object message, Object details) {
if (!globalThreshold.supports(Log.Level.ERROR))
return;
else if (slf4j != null)
slf4j.error(getMessage(message, details));
else
util.severe("" + getMessage(message, details));
}
Log a message in ERROR
level.
Params: - message – The log message
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>ERROR</code> level.
*
* @param message The log message
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void error(Object message, Throwable throwable) {
error(message, null, throwable);
}
Log a message in ERROR
level.
Params: - message – The log message
- details – The message details (padded to a constant-width message)
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in <code>ERROR</code> level.
*
* @param message The log message
* @param details The message details (padded to a constant-width message)
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void error(Object message, Object details, Throwable throwable) {
if (!globalThreshold.supports(Log.Level.ERROR))
return;
else if (slf4j != null)
slf4j.error(getMessage(message, details), throwable);
else
util.log(java.util.logging.Level.SEVERE, "" + getMessage(message, details), throwable);
}
Log a message in a given log level.
Params: - level – The log level
- message – The log message
/**
* Log a message in a given log level.
*
* @param level The log level
* @param message The log message
*/
@Override
public void log(Log.Level level, Object message) {
log(level, message, (Object) null);
}
Log a message in a given log level.
Params: - level – The log level
- message – The log message
- details – The message details (padded to a constant-width message)
/**
* Log a message in a given log level.
*
* @param level The log level
* @param message The log message
* @param details The message details (padded to a constant-width message)
*/
@Override
public void log(Log.Level level, Object message, Object details) {
switch (level) {
case TRACE: trace(message, details); break;
case DEBUG: debug(message, details); break;
case INFO: info (message, details); break;
case WARN: warn (message, details); break;
case ERROR: error(message, details); break;
case FATAL: error(message, details); break;
}
}
Log a message in a given log level.
Params: - level – The log level
- message – The log message
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in a given log level.
*
* @param level The log level
* @param message The log message
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void log(Log.Level level, Object message, Throwable throwable) {
log(level, message, null, throwable);
}
Log a message in a given log level.
Params: - level – The log level
- message – The log message
- details – The message details (padded to a constant-width message)
- throwable – An exception whose stacktrace is logged along with the
message
/**
* Log a message in a given log level.
*
* @param level The log level
* @param message The log message
* @param details The message details (padded to a constant-width message)
* @param throwable An exception whose stacktrace is logged along with the
* message
*/
@Override
public void log(Log.Level level, Object message, Object details, Throwable throwable) {
switch (level) {
case TRACE: trace(message, details, throwable); break;
case DEBUG: debug(message, details, throwable); break;
case INFO: info (message, details, throwable); break;
case WARN: warn (message, details, throwable); break;
case ERROR: error(message, details, throwable); break;
case FATAL: error(message, details, throwable); break;
}
}
Get a formatted message.
/**
* Get a formatted message.
*/
private String getMessage(Object message, Object details) {
StringBuilder sb = new StringBuilder();
sb.append(StringUtils.rightPad("" + message, 25));
if (details != null) {
sb.append(": ");
sb.append(details);
}
return sb.toString();
}
Set a global level threshold to all JooqLoggers.
/**
* Set a global level threshold to all JooqLoggers.
*/
public static void globalThreshold(Level level) {
switch (level) {
case TRACE: globalThreshold(Log.Level.TRACE); break;
case DEBUG: globalThreshold(Log.Level.DEBUG); break;
case INFO: globalThreshold(Log.Level.INFO); break;
case WARN: globalThreshold(Log.Level.WARN); break;
case ERROR: globalThreshold(Log.Level.ERROR); break;
case FATAL: globalThreshold(Log.Level.FATAL); break;
}
}
Set a global level threshold to all JooqLoggers.
/**
* Set a global level threshold to all JooqLoggers.
*/
public static void globalThreshold(Log.Level level) {
globalThreshold = level;
}
The log level.
Deprecated: - Use Level
instead
/**
* The log level.
*
* @deprecated - Use {@link org.jooq.Log.Level} instead
*/
@Deprecated
public static enum Level {
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
FATAL;
public boolean supports(Level level) {
return ordinal() <= level.ordinal();
}
}
}