com.wavefront.sdk.common.logging.DelegatingLogger Maven / Gradle / Ivy
package com.wavefront.sdk.common.logging;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
/**
* Base class for delegating loggers.
*
* @author [email protected]
* @version $Id: $Id
*/
public abstract class DelegatingLogger extends Logger {
protected final Logger delegate;
/**
* Constructor for DelegatingLogger.
*
* @param delegate Delegate logger.
*/
public DelegatingLogger(Logger delegate) {
super(delegate.getName(), null);
this.delegate = delegate;
}
/** {@inheritDoc} */
@Override
public abstract void log(Level level, String message);
/** {@inheritDoc} */
@Override
public void log(LogRecord logRecord) {
if (!isLoggable(logRecord.getLevel())) {
return;
}
logRecord.setLoggerName(delegate.getName());
// Infer caller so that the log message contains the right '[source class] [source method]'
// instead of 'DelegatingLogger log'
inferCaller(logRecord);
delegate.log(logRecord);
}
/**
* This is a JDK8-specific implementation that is quite expensive because it fetches the
* current stack trace. TODO: switch to StackWalker after migrating to JDK9+
*/
void inferCaller(LogRecord logRecord) {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
boolean lookingForLogger = true;
for (StackTraceElement frame : stackTraceElements) {
String cname = frame.getClassName();
if (lookingForLogger) {
// Skip all frames until we have found the first logger frame.
if (cname.endsWith("Logger")) {
lookingForLogger = false;
}
} else {
if (!cname.endsWith("Logger") && !cname.startsWith("java.lang.reflect.") &&
!cname.startsWith("sun.reflect.")) {
// We've found the relevant frame.
logRecord.setSourceClassName(cname);
logRecord.setSourceMethodName(frame.getMethodName());
return;
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy