HADOOP-14617. Add ReflectionUtils.logThreadInfo that accept slf4j logger API.

Contributed by Wenxin He.
This commit is contained in:
Steve Loughran 2017-07-04 10:52:59 +01:00
parent f2aba1da30
commit b17e655b70
2 changed files with 48 additions and 1 deletions

View File

@ -46,6 +46,7 @@ import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.serializer.Deserializer;
import org.apache.hadoop.io.serializer.SerializationFactory;
import org.apache.hadoop.io.serializer.Serializer;
import org.slf4j.Logger;
/**
* General reflection utils
@ -228,6 +229,35 @@ public class ReflectionUtils {
}
}
/**
* Log the current thread stacks at INFO level.
* @param log the logger that logs the stack trace
* @param title a descriptive title for the call stacks
* @param minInterval the minimum time from the last
*/
public static void logThreadInfo(Logger log,
String title,
long minInterval) {
boolean dumpStack = false;
if (log.isInfoEnabled()) {
synchronized (ReflectionUtils.class) {
long now = Time.now();
if (now - previousLogTime >= minInterval * 1000) {
previousLogTime = now;
dumpStack = true;
}
}
if (dumpStack) {
try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
printThreadInfo(new PrintStream(buffer, false, "UTF-8"), title);
log.info(buffer.toString(Charset.defaultCharset().name()));
} catch (UnsupportedEncodingException ignored) {
}
}
}
}
/**
* Return the correctly-typed {@link Class} of the given object.
*

View File

@ -25,9 +25,14 @@ import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.List;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;
import org.apache.hadoop.test.GenericTestUtils.LogCapturer;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestReflectionUtils {
@ -150,7 +155,19 @@ public class TestReflectionUtils {
assertTrue("Missing parent method", containsParentMethod);
assertTrue("Missing child method", containsChildMethod);
}
@Test
public void testLogThreadInfo() throws Exception {
Logger logger = LoggerFactory.getLogger(TestReflectionUtils.class);
LogCapturer logCapturer = LogCapturer.captureLogs(logger);
final String title = "title";
ReflectionUtils.logThreadInfo(logger, title, 0L);
assertThat(logCapturer.getOutput(),
containsString("Process Thread Dump: " + title));
}
// Used for testGetDeclaredFieldsIncludingInherited
private class Parent {
private int parentField;