mirror of
https://github.com/alibaba/arthas.git
synced 2024-04-21 10:21:39 +00:00
Add --classLoaderClass for logger (#1445)
This commit is contained in:
@@ -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()));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user