Add --classLoaderClass for logger (#1445)

This commit is contained in:
Hollow Man
2020-08-26 11:24:44 +08:00
committed by GitHub
parent e63e0cfc6a
commit 74c313ecaa
7 changed files with 114 additions and 6 deletions
@@ -20,8 +20,10 @@ import com.taobao.arthas.common.IOUtils;
import com.taobao.arthas.common.ReflectUtils;
import com.taobao.arthas.core.command.Constants;
import com.taobao.arthas.core.command.model.LoggerModel;
import com.taobao.arthas.core.command.model.ClassLoaderVO;
import com.taobao.arthas.core.shell.command.AnnotatedCommand;
import com.taobao.arthas.core.shell.command.CommandProcess;
import com.taobao.arthas.core.util.ClassUtils;
import com.taobao.arthas.core.util.ClassLoaderUtils;
import com.taobao.arthas.core.util.StringUtils;
import com.taobao.middleware.cli.annotations.Description;
@@ -72,6 +74,7 @@ public class LoggerCommand extends AnnotatedCommand {
private String name;
private String hashCode;
private String classLoaderClass;
private String level;
@@ -92,6 +95,12 @@ public class LoggerCommand extends AnnotatedCommand {
this.hashCode = hashCode;
}
@Option(longName = "classLoaderClass")
@Description("The class name of the special class's classLoader.")
public void setClassLoaderClass(String classLoaderClass) {
this.classLoaderClass = classLoaderClass;
}
@Option(shortName = "l", longName = "level")
@Description("set logger level")
public void setLevel(String level) {
@@ -158,6 +167,25 @@ public class LoggerCommand extends AnnotatedCommand {
String className = clazz.getName();
ClassLoader classLoader = clazz.getClassLoader();
if (hashCode == null && classLoaderClass != null) {
Instrumentation inst = process.session().getInstrumentation();
List<ClassLoader> matchedClassLoaders = ClassLoaderUtils.getClassLoaderByClassName(inst, classLoaderClass);
if (matchedClassLoaders.size() == 1) {
hashCode = Integer.toHexString(matchedClassLoaders.get(0).hashCode());
} else if (matchedClassLoaders.size() > 1) {
Collection<ClassLoaderVO> classLoaderVOList = ClassUtils.createClassLoaderVOList(matchedClassLoaders);
LoggerModel loggerModel = new LoggerModel()
.setClassLoaderClass(classLoaderClass)
.setMatchedClassLoaders(classLoaderVOList);
process.appendResult(loggerModel);
process.end(-1, "Found more than one classloader by class name, please specify classloader with '-c <classloader hash>'");
return;
} else {
process.end(-1, "Can not find classloader by class name: " + classLoaderClass + ".");
return;
}
}
// if special classloader
if (this.hashCode != null && !this.hashCode.equals(StringUtils.classLoaderHash(clazz))) {
continue;
@@ -1,5 +1,7 @@
package com.taobao.arthas.core.command.model;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
@@ -10,6 +12,8 @@ import java.util.Map;
public class LoggerModel extends ResultModel {
private Map<String, Map<String, Object>> loggerInfoMap;
private Collection<ClassLoaderVO> matchedClassLoaders;
private String classLoaderClass;
public LoggerModel() {
}
@@ -26,6 +30,24 @@ public class LoggerModel extends ResultModel {
this.loggerInfoMap = loggerInfoMap;
}
public String getClassLoaderClass() {
return classLoaderClass;
}
public LoggerModel setClassLoaderClass(String classLoaderClass) {
this.classLoaderClass = classLoaderClass;
return this;
}
public Collection<ClassLoaderVO> getMatchedClassLoaders() {
return matchedClassLoaders;
}
public LoggerModel setMatchedClassLoaders(Collection<ClassLoaderVO> matchedClassLoaders) {
this.matchedClassLoaders = matchedClassLoaders;
return this;
}
@Override
public String getType() {
return "logger";
@@ -22,6 +22,12 @@ public class LoggerView extends ResultView<LoggerModel> {
@Override
public void draw(CommandProcess process, LoggerModel result) {
if (result.getMatchedClassLoaders() != null) {
process.write("Matched classloaders: \n");
ClassLoaderView.drawClassLoaders(process, result.getMatchedClassLoaders(), false);
process.write("\n");
return;
}
process.write(renderLoggerInfo(result.getLoggerInfoMap(), process.width()));
}