blob: 156eab1f793037c2d78a9d75ddd0611788d2200a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.uima.util.impl;
import java.text.MessageFormat;
import org.apache.uima.internal.util.Misc;
import org.apache.uima.util.Level;
import org.apache.uima.util.Logger;
import org.slf4j.Marker;
import org.slf4j.spi.LocationAwareLogger;
/**
* UIMA Logging interface implementation for SLF4j
*
* This design gets a logger in static initialization,
* in order to see what the back end is. If it is JUL or Log4j,
* it sets flags so that subsequent calls to getInstance gets those
* UIMA logger impls, not this one,
* in order to slightly reduce indirection at run time.
*
*/
public class Slf4jLogger_impl extends Logger_common_impl {
public static final String DEFAULT_JUL = "uima.use_jul_as_default_uima_logger";
public static final boolean IS_DEFAULT_JUL = Misc.getNoValueSystemProperty(DEFAULT_JUL);
static final boolean isJul;
static final boolean isLog4j;
static {
Class<?> staticLoggerBinderClass = null;
try {
staticLoggerBinderClass = Class.forName("org.slf4j.impl.StaticLoggerBinder");
} catch (Exception e) {
// empty on purpose, if class not present, no back end logger, and staticLoggerBinderClass is left as null
}
if (null == staticLoggerBinderClass) {
if (IS_DEFAULT_JUL) {
isJul = true;
isLog4j = false;
} else {
isJul = false;
isLog4j = false;
}
} else {
// have some backend binding
boolean tb;
org.slf4j.Logger tempLogger = org.slf4j.LoggerFactory.getLogger("org.apache.uima");
try { // for jdk14 impl
Class<?> clazz = Class.forName("org.slf4j.impl.JDK14LoggerAdapter");
tb = clazz != null && clazz.isAssignableFrom(tempLogger.getClass());
} catch (ClassNotFoundException e1) {
tb = false;
}
isJul = tb;
tb = false;
if (!isJul) {
try { // for log4j 2 impl
Class<?> clazz = Class.forName("org.apache.logging.slf4j.Log4jLogger");
tb = null != clazz && clazz.isAssignableFrom(tempLogger.getClass());
} catch (ClassNotFoundException e1) {
tb = false;
}
}
isLog4j = tb;
}
}
/**
* logger object from the underlying Slf4j logging framework
*/
final private org.slf4j.Logger logger;
final private boolean isLocationCapable; // the slf4j simple logger is not
/**
* create a new LogWrapper class for the specified source class
*
* @param component
* specified source class
*/
private Slf4jLogger_impl(Class<?> component) {
super(component);
final String loggerName = (component != null)
? component.getName()
: "org.apache.uima";
logger = org.slf4j.LoggerFactory.getLogger(loggerName);
isLocationCapable = logger instanceof org.slf4j.spi.LocationAwareLogger;
}
private Slf4jLogger_impl(Slf4jLogger_impl l, int limit) {
super(l, limit);
this.logger = l.logger;
isLocationCapable = logger instanceof org.slf4j.spi.LocationAwareLogger;
}
/**
* creates a new Logger instance for the specified source class
*
* @param component
* current source class
*
* @return Logger - returns the Logger object for the specified class
*/
public static synchronized Logger getInstance(Class<?> component) {
if (isJul) {
return JSR47Logger_impl.getInstance(component);
}
if (isLog4j) {
return Log4jLogger_impl.getInstance(component);
}
return new Slf4jLogger_impl(component);
}
/**
* creates a new Logger instance using default name "org.apache.uima"
*
* @return Logger - returns the Logger object for the specified class
*/
public static synchronized Logger getInstance() {
return getInstance(null);
}
public Slf4jLogger_impl getLimitedLogger(int aLimit) {
if (aLimit == Integer.MAX_VALUE || aLimit == this.limit_common) {
return this;
}
return new Slf4jLogger_impl(this, aLimit);
}
public static int getSlf4jLevel(Level level) {
switch(level.toInteger()) {
case Level.SEVERE_INT: return LocationAwareLogger.ERROR_INT;
case Level.WARNING_INT: return LocationAwareLogger.WARN_INT;
case Level.INFO_INT: return LocationAwareLogger.INFO_INT;
case Level.CONFIG_INT: return LocationAwareLogger.INFO_INT;
case Level.FINE_INT: return LocationAwareLogger.DEBUG_INT;
case Level.FINER_INT: return LocationAwareLogger.TRACE_INT;
case Level.FINEST_INT: return LocationAwareLogger.TRACE_INT;
}
Misc.internalError();
return LocationAwareLogger.ERROR_INT; //ignored, just here for compile error avoidance
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#isLoggable(org.apache.uima.util.Level)
*/
public boolean isLoggable(Level level) {
switch (level.toInteger()) {
case org.apache.uima.util.Level.OFF_INT:
return false;
case org.apache.uima.util.Level.SEVERE_INT:
return logger.isErrorEnabled();
case org.apache.uima.util.Level.WARNING_INT:
return logger.isWarnEnabled();
case org.apache.uima.util.Level.INFO_INT:
return logger.isInfoEnabled();
case org.apache.uima.util.Level.CONFIG_INT:
return logger.isInfoEnabled(UIMA_MARKER_CONFIG);
case org.apache.uima.util.Level.FINE_INT:
return logger.isDebugEnabled();
case org.apache.uima.util.Level.FINER_INT:
return logger.isTraceEnabled();
case org.apache.uima.util.Level.FINEST_INT:
return logger.isTraceEnabled(UIMA_MARKER_FINEST);
default: // for Level.ALL return false, that's what jul logger does
return false;
}
}
public boolean isLoggable(Level level, Marker marker) {
switch (level.toInteger()) {
case org.apache.uima.util.Level.OFF_INT:
return false;
case org.apache.uima.util.Level.SEVERE_INT:
return logger.isErrorEnabled(marker);
case org.apache.uima.util.Level.WARNING_INT:
return logger.isWarnEnabled(marker);
case org.apache.uima.util.Level.INFO_INT:
return logger.isInfoEnabled(marker);
case org.apache.uima.util.Level.CONFIG_INT:
return logger.isInfoEnabled(marker);
case org.apache.uima.util.Level.FINE_INT:
return logger.isDebugEnabled(marker);
case org.apache.uima.util.Level.FINER_INT:
return logger.isTraceEnabled(marker);
case org.apache.uima.util.Level.FINEST_INT:
return logger.isTraceEnabled(marker);
default: // for Level.ALL return false, that's what jul logger does
return false;
}
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.util.Logger#setLevel(org.apache.uima.util.Level)
*/
public void setLevel(Level level) {
// allow nop operation
}
// does the uima-logger style of message formatting
public void log(Marker m, String aFqcn, Level level, String message, Object[] args, Throwable thrown) {
log(m, aFqcn, level, MessageFormat.format(message, args), thrown);
}
@Override
public void log(Marker m, String aFqcn, Level level, String msg_with_params, Throwable thrown) {
m = (m == null)
? getMarkerForLevel(level)
: m;
if (isLocationCapable) { // slf4j simple logger is not
((org.slf4j.spi.LocationAwareLogger)logger).log(m, aFqcn, getSlf4jLevel(level), msg_with_params, null, thrown);
} else {
switch(level.toInteger()) {
case Level.SEVERE_INT:
// all of these calls to MessageFormat are to the java.text.MessageFormat
// to do {n} style format substitution
logger.error(m, msg_with_params, thrown);
break;
case Level.WARNING_INT:
logger.warn(m, msg_with_params, thrown);
break;
case Level.INFO_INT:
logger.info(m, msg_with_params, thrown);
break;
case Level.CONFIG_INT:
logger.info(m, msg_with_params, thrown);
break;
case Level.FINE_INT:
logger.debug(m, msg_with_params, thrown);
break;
case Level.FINER_INT:
logger.trace(m, msg_with_params, thrown);
break;
case Level.FINEST_INT:
logger.trace(m, msg_with_params, thrown);
break;
default: Misc.internalError();
}
}
}
// does the slf4j style of message formatting
public void log2(Marker m, String aFqcn, Level level, String message, Object[] args, Throwable thrown) {
m = (m == null)
? getMarkerForLevel(level)
: m;
if (isLocationCapable) { // slf4j simple logger is not
((org.slf4j.spi.LocationAwareLogger)logger).log(m, aFqcn, getSlf4jLevel(level), message, args, thrown);
} else {
if (thrown != null) {
Object[] args1 = (args == null) ? new Object[1] : new Object[args.length + 1];
if (args != null) {
System.arraycopy(args, 0, args1, 0, args.length);
}
args1[args1.length - 1] = thrown;
args = args1;
}
switch(level.toInteger()) {
case Level.SEVERE_INT:
logger.error(m, message, args);
break;
case Level.WARNING_INT:
logger.warn(m, message, args);
break;
case Level.INFO_INT:
logger.info(m, message, args);
break;
case Level.CONFIG_INT:
logger.info(m, message, args);
break;
case Level.FINE_INT:
logger.debug(m, message, args);
break;
case Level.FINER_INT:
logger.trace(m, message, args);
break;
case Level.FINEST_INT:
logger.trace(m, message, args);
break;
default: Misc.internalError();
}
}
}
/**
* @return the logger name
* @see org.slf4j.Logger#getName()
*/
public String getName() {
return logger.getName();
}
/**
* @return -
* @see org.slf4j.Logger#isTraceEnabled()
*/
public boolean isTraceEnabled() {
return logger.isTraceEnabled();
}
/**
* @param marker -
* @return true if trace is enabled for this marker
* @see org.slf4j.Logger#isTraceEnabled(org.slf4j.Marker)
*/
public boolean isTraceEnabled(Marker marker) {
return logger.isTraceEnabled(marker);
}
/**
* @return -
* @see org.slf4j.Logger#isDebugEnabled()
*/
public boolean isDebugEnabled() {
return logger.isDebugEnabled();
}
/**
* @param marker -
* @return true if is enabled for this marker
* @see org.slf4j.Logger#isDebugEnabled(org.slf4j.Marker)
*/
public boolean isDebugEnabled(Marker marker) {
return logger.isDebugEnabled(marker);
}
/**
* @return -
* @see org.slf4j.Logger#isInfoEnabled()
*/
public boolean isInfoEnabled() {
return logger.isInfoEnabled();
}
/**
* @param marker -
* @return true if is enabled for this marker
* @see org.slf4j.Logger#isInfoEnabled(org.slf4j.Marker)
*/
public boolean isInfoEnabled(Marker marker) {
return logger.isInfoEnabled(marker);
}
/**
* @return -
* @see org.slf4j.Logger#isWarnEnabled()
*/
public boolean isWarnEnabled() {
return logger.isWarnEnabled();
}
/**
* @param marker -
* @return true if is enabled for this marker
* @see org.slf4j.Logger#isWarnEnabled(org.slf4j.Marker)
*/
public boolean isWarnEnabled(Marker marker) {
return logger.isWarnEnabled(marker);
}
/**
* @return -
* @see org.slf4j.Logger#isErrorEnabled()
*/
public boolean isErrorEnabled() {
return logger.isErrorEnabled();
}
/**
* @param marker -
* @return true if is enabled for this marker
* @see org.slf4j.Logger#isErrorEnabled(org.slf4j.Marker)
*/
public boolean isErrorEnabled(Marker marker) {
return logger.isErrorEnabled(marker);
}
}