diff --git a/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java b/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java index 132b607d8..3f57ada02 100755 --- a/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java +++ b/agent/src/main/java/com/taobao/arthas/agent/AgentBootstrap.java @@ -160,7 +160,7 @@ public class AgentBootstrap { * */ Class bootstrapClass = agentLoader.loadClass(ARTHAS_BOOTSTRAP); - Object bootstrap = bootstrapClass.getMethod(GET_INSTANCE, Instrumentation.class).invoke(null, inst); + Object bootstrap = bootstrapClass.getMethod(GET_INSTANCE, Instrumentation.class, String.class).invoke(null, inst, args); boolean isBind = (Boolean) bootstrapClass.getMethod(IS_BIND).invoke(bootstrap); if (!isBind) { try { diff --git a/core/pom.xml b/core/pom.xml index 4a9a9ba9b..7e5771332 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -10,6 +10,10 @@ arthas-core arthas-core + + com.alibaba.arthas.deps + + arthas-core @@ -27,7 +31,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.4.3 + 3.2.1 package @@ -48,6 +52,17 @@ + + + + org.slf4j + ${arthas.deps.package}.org.slf4j + + + ch.qos.logback + ${arthas.deps.package}.ch.qos.logback + + com.alibaba.middleware:termd-core @@ -64,6 +79,27 @@ + + + maven-antrun-plugin + + + package + + + + + + + + + + + run + + + + @@ -130,10 +166,6 @@ ch.qos.logback logback-core - - com.taobao.middleware - logger.api - com.alibaba.arthas arthas-repackage-logger diff --git a/core/src/main/java/arthas.properties b/core/src/main/java/arthas.properties new file mode 100644 index 000000000..b306b7cb4 --- /dev/null +++ b/core/src/main/java/arthas.properties @@ -0,0 +1,3 @@ +#arthas.config.overrideAll=true +#arthas.telnetPort=9998 +#arthas.httpPort=9999 diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java index 5b1cfed8a..e7d26b0fc 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceWeaver.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.advisor; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.util.matcher.Matcher; import com.taobao.arthas.core.util.*; @@ -7,7 +9,6 @@ import com.taobao.arthas.core.util.affect.EnhancerAffect; import com.taobao.arthas.core.util.collection.GaStack; import com.taobao.arthas.core.util.collection.ThreadUnsafeFixGaStack; import com.taobao.arthas.core.util.collection.ThreadUnsafeGaStack; -import com.taobao.middleware.logger.Logger; import org.objectweb.asm.*; import org.objectweb.asm.commons.AdviceAdapter; import org.objectweb.asm.commons.JSRInlinerAdapter; @@ -28,7 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public class AdviceWeaver extends ClassVisitor implements Opcodes { - private final static Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(AdviceWeaver.class); public static final String ON_BEFORE = "methodOnBegin"; public static final String ON_RETURN = "methodOnReturnEnd"; diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java b/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java index 5ae3b313c..02057e743 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/Enhancer.java @@ -1,15 +1,15 @@ package com.taobao.arthas.core.advisor; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.util.Constants; import com.taobao.arthas.core.util.FileUtils; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.matcher.Matcher; import com.taobao.arthas.core.util.SearchUtils; import com.taobao.arthas.core.util.affect.EnhancerAffect; import com.taobao.arthas.core.util.reflect.FieldUtils; -import com.taobao.middleware.logger.Logger; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; @@ -35,7 +35,7 @@ import static org.objectweb.asm.ClassWriter.COMPUTE_MAXS; */ public class Enhancer implements ClassFileTransformer { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(Enhancer.class); private final int adviceId; private final boolean isTracing; diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java index f5262223a..d10efaf0c 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java @@ -5,23 +5,23 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.List; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; import com.taobao.arthas.core.util.FileUtils; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.middleware.cli.annotations.Argument; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; @Name("cat") @Summary("Concatenate and print files") public class CatCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(CatCommand.class); private List files; private String encoding; @@ -65,7 +65,7 @@ public class CatCommand extends AnnotatedCommand { encoding == null ? Charset.defaultCharset() : Charset.forName(encoding)); process.write(fileToString); } catch (IOException e) { - logger.error(null, "cat read file error. name: " + file, e); + logger.error("cat read file error. name: " + file, e); process.write("cat read file error: " + e.getMessage() + '\n'); process.end(1); return; diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/KeymapCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/KeymapCommand.java index 53783bd31..4765bb846 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/KeymapCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/KeymapCommand.java @@ -1,15 +1,15 @@ package com.taobao.arthas.core.command.basic1000; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.common.IOUtils; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; import com.taobao.arthas.core.shell.term.impl.Helper; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Decoration; import com.taobao.text.ui.TableElement; import com.taobao.text.util.RenderUtil; @@ -31,7 +31,7 @@ import java.io.InputStreamReader; @Summary("Display all the available keymap for the specified connection.") @Description(Constants.WIKI + Constants.WIKI_HOME + "keymap") public class KeymapCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(KeymapCommand.class); @Override public void process(CommandProcess process) { @@ -59,7 +59,7 @@ public class KeymapCommand extends AnnotatedCommand { } process.write(RenderUtil.render(table, process.width())); } catch (IOException e) { - logger.error("keymap", "read inputrc file error.", e); + logger.error("read inputrc file error.", e); } finally { IOUtils.close(inputrc); process.end(); diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/VMOptionCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/VMOptionCommand.java index cdbd6d6de..cefbacd85 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/VMOptionCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/VMOptionCommand.java @@ -7,20 +7,21 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.sun.management.HotSpotDiagnosticMXBean; import com.sun.management.VMOption; import com.taobao.arthas.core.command.Constants; +import com.taobao.arthas.core.command.express.OgnlExpress; import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.StringUtils; import com.taobao.middleware.cli.annotations.Argument; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Decoration; import com.taobao.text.ui.TableElement; import com.taobao.text.util.RenderUtil; @@ -36,7 +37,7 @@ import com.taobao.text.util.RenderUtil; @Description("\nExamples:\n" + " vmoption\n" + " vmoption PrintGCDetails\n" + " vmoption PrintGCDetails true\n" + Constants.WIKI + Constants.WIKI_HOME + "vmoption") public class VMOptionCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(VMOptionCommand.class); private String name; private String value; @@ -82,7 +83,7 @@ public class VMOptionCommand extends AnnotatedCommand { } } catch (Throwable t) { process.write("Error during setting vm option: " + t.getMessage() + "\n"); - logger.error("arthas", "Error during setting vm option", t); + logger.error("Error during setting vm option", t); } finally { process.end(); } diff --git a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java index a9321304b..85e52e3fb 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java +++ b/core/src/main/java/com/taobao/arthas/core/command/express/OgnlExpress.java @@ -1,7 +1,7 @@ package com.taobao.arthas.core.command.express; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import ognl.ClassResolver; import ognl.DefaultMemberAccess; @@ -15,7 +15,7 @@ import ognl.OgnlContext; */ public class OgnlExpress implements Express { private static final MemberAccess MEMBER_ACCESS = new DefaultMemberAccess(true); - Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(OgnlExpress.class); private Object bindObject; private final OgnlContext context; @@ -36,7 +36,7 @@ public class OgnlExpress implements Express { try { return Ognl.getValue(express, context, bindObject); } catch (Exception e) { - logger.error(null, "Error during evaluating the expression:", e); + logger.error("Error during evaluating the expression:", e); throw new ExpressException(express, e); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassDumpTransformer.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassDumpTransformer.java index ce513fbff..773d47c7d 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassDumpTransformer.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/ClassDumpTransformer.java @@ -1,8 +1,9 @@ package com.taobao.arthas.core.command.klass100; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.util.FileUtils; import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; import java.io.File; import java.io.IOException; @@ -18,7 +19,7 @@ import java.util.Set; */ class ClassDumpTransformer implements ClassFileTransformer { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(ClassDumpTransformer.class); private Set> classesToEnhance; private Map, File> dumpResult; @@ -33,7 +34,7 @@ class ClassDumpTransformer implements ClassFileTransformer { public ClassDumpTransformer(Set> classesToEnhance, File directory) { this.classesToEnhance = classesToEnhance; this.dumpResult = new HashMap, File>(); - this.arthasLogHome = new File(LogUtil.LOGS_ARTHAS_DIR); + this.arthasLogHome = new File(LogUtil.loggingDir()); this.directory = directory; } diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/DumpClassCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/DumpClassCommand.java index d5e044643..73fddd1e5 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/DumpClassCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/DumpClassCommand.java @@ -1,12 +1,13 @@ package com.taobao.arthas.core.command.klass100; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.Enhancer; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.SearchUtils; import com.taobao.arthas.core.util.StringUtils; import com.taobao.arthas.core.util.TypeRenderUtils; @@ -17,7 +18,6 @@ import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Color; import com.taobao.text.Decoration; import com.taobao.text.ui.LabelElement; @@ -45,7 +45,7 @@ import static com.taobao.text.ui.Element.label; " dump -E org\\\\.apache\\\\.commons\\\\.lang\\\\.StringUtils\n" + Constants.WIKI + Constants.WIKI_HOME + "dump") public class DumpClassCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(DumpClassCommand.class); private String classPattern; private String code = null; @@ -141,7 +141,7 @@ public class DumpClassCommand extends AnnotatedCommand { .write(com.taobao.arthas.core.util.Constants.EMPTY_STRING); effect.rCnt(classFiles.keySet().size()); } catch (Throwable t) { - logger.error(null, "dump: fail to dump classes: " + matchedClasses, t); + logger.error("dump: fail to dump classes: " + matchedClasses, t); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/GetStaticCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/GetStaticCommand.java index d29613d43..ed0296a12 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/GetStaticCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/GetStaticCommand.java @@ -1,11 +1,12 @@ package com.taobao.arthas.core.command.klass100; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.command.express.ExpressException; import com.taobao.arthas.core.command.express.ExpressFactory; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.SearchUtils; import com.taobao.arthas.core.util.StringUtils; import com.taobao.arthas.core.util.TypeRenderUtils; @@ -19,7 +20,6 @@ import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Color; import com.taobao.text.Decoration; import com.taobao.text.ui.Element; @@ -46,7 +46,7 @@ import static com.taobao.text.ui.Element.label; Constants.WIKI + Constants.WIKI_HOME + "getstatic") public class GetStaticCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(GetStaticCommand.class); private String classPattern; private String fieldPattern; @@ -138,13 +138,11 @@ public class GetStaticCommand extends AnnotatedCommand { affect.rCnt(1); } catch (IllegalAccessException e) { - logger.warn("getstatic: failed to get static value, class: " + clazz + ", field: " + field.getName(), - e); + logger.warn("getstatic: failed to get static value, class: {}, field: {} ", clazz, field.getName(), e); process.write("Failed to get static, exception message: " + e.getMessage() + ", please check $HOME/logs/arthas/arthas.log for more details. \n"); } catch (ExpressException e) { - logger.warn("getstatic: failed to get express value, class: " + clazz + ", field: " + field.getName() - + ", express: " + express, e); + logger.warn("getstatic: failed to get express value, class: {}, field: {}, express: {}", clazz, field.getName(), express, e); process.write("Failed to get static, exception message: " + e.getMessage() + ", please check $HOME/logs/arthas/arthas.log for more details. \n"); } finally { diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java index 2ef066a50..fbb2bb6f9 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/JadCommand.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.command.klass100; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; @@ -7,7 +9,6 @@ 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.Decompiler; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.SearchUtils; import com.taobao.arthas.core.util.TypeRenderUtils; import com.taobao.arthas.core.util.affect.RowAffect; @@ -16,7 +17,6 @@ import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Color; import com.taobao.text.Decoration; import com.taobao.text.lang.LangRenderUtil; @@ -49,7 +49,7 @@ import static com.taobao.text.ui.Element.label; " jad -c 39eb305e -E org\\\\.apache\\\\.*\\\\.StringUtils\n" + Constants.WIKI + Constants.WIKI_HOME + "jad") public class JadCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(JadCommand.class); private static Pattern pattern = Pattern.compile("(?m)^/\\*\\s*\\*/\\s*$" + System.getProperty("line.separator")); private String classPattern; @@ -133,7 +133,7 @@ public class JadCommand extends AnnotatedCommand { if(ClassUtils.isLambdaClass(clazz) && e instanceof VerifyError) { errorMsg += ", Please ignore lambda class VerifyError: https://github.com/alibaba/arthas/issues/675"; } - logger.error("jad", errorMsg, e); + logger.error(errorMsg, e); } } } finally { @@ -176,7 +176,7 @@ public class JadCommand extends AnnotatedCommand { process.write(com.taobao.arthas.core.util.Constants.EMPTY_STRING); affect.rCnt(classFiles.keySet().size()); } catch (Throwable t) { - logger.error(null, "jad: fail to decompile class: " + c.getName(), t); + logger.error("jad: fail to decompile class: " + c.getName(), t); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/MemoryCompilerCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/MemoryCompilerCommand.java index e0f6ae850..0ed22c5fb 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/MemoryCompilerCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/MemoryCompilerCommand.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.compiler.DynamicCompiler; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.cli.Completion; @@ -15,14 +17,12 @@ import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; import com.taobao.arthas.core.util.ClassLoaderUtils; import com.taobao.arthas.core.util.FileUtils; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.affect.RowAffect; import com.taobao.middleware.cli.annotations.Argument; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; /** * @@ -36,7 +36,7 @@ import com.taobao.middleware.logger.Logger; + "mc") public class MemoryCompilerCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(MemoryCompilerCommand.class); private String directory; private String hashCode; diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java index 3a9f42e3d..f5979d6de 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/OgnlCommand.java @@ -2,6 +2,8 @@ package com.taobao.arthas.core.command.klass100; import java.lang.instrument.Instrumentation; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.command.express.Express; import com.taobao.arthas.core.command.express.ExpressException; @@ -9,7 +11,6 @@ import com.taobao.arthas.core.command.express.ExpressFactory; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; import com.taobao.arthas.core.util.ClassLoaderUtils; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.StringUtils; import com.taobao.arthas.core.view.ObjectView; import com.taobao.middleware.cli.annotations.Argument; @@ -17,7 +18,6 @@ import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; /** * @@ -35,7 +35,7 @@ import com.taobao.middleware.logger.Logger; + Constants.WIKI + Constants.WIKI_HOME + "ognl\n" + " https://commons.apache.org/proper/commons-ognl/language-guide.html") public class OgnlCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(OgnlCommand.class); private String express; diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java index 2bc680554..769bcf557 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/RedefineCommand.java @@ -10,11 +10,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; import org.objectweb.asm.ClassReader; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.command.Constants; +import com.taobao.arthas.core.command.logger.LoggerCommand; import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; import com.taobao.arthas.core.shell.command.AnnotatedCommand; @@ -38,7 +39,7 @@ import com.taobao.middleware.cli.annotations.Summary; " redefine -c 327a647b /tmp/Test.class /tmp/Test\\$Inner.class \n" + Constants.WIKI + Constants.WIKI_HOME + "redefine") public class RedefineCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(RedefineCommand.class); private static final int MAX_FILE_SIZE = 10 * 1024 * 1024; private String hashCode; @@ -118,7 +119,7 @@ public class RedefineCommand extends AnnotatedCommand { continue; } definitions.add(new ClassDefinition(clazz, bytesMap.get(clazz.getName()))); - logger.info("redefine", "Try redefine class name: {}, ClassLoader: {}", clazz.getName(), clazz.getClassLoader()); + logger.info("Try redefine class name: {}, ClassLoader: {}", clazz.getName(), clazz.getClassLoader()); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/logger/LoggerCommand.java b/core/src/main/java/com/taobao/arthas/core/command/logger/LoggerCommand.java index 2908b0488..8af57570d 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/logger/LoggerCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/logger/LoggerCommand.java @@ -16,19 +16,19 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.common.IOUtils; import com.taobao.arthas.common.ReflectUtils; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; import com.taobao.arthas.core.util.ClassLoaderUtils; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.StringUtils; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Decoration; import com.taobao.text.ui.TableElement; import com.taobao.text.util.RenderUtil; @@ -50,7 +50,7 @@ import com.taobao.text.util.RenderUtil; + Constants.WIKI + Constants.WIKI_HOME + "logger") //@formatter:on public class LoggerCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(LoggerCommand.class); private static byte[] LoggerHelperBytes; private static byte[] Log4jHelperBytes; @@ -143,7 +143,7 @@ public class LoggerCommand extends AnnotatedCommand { result = true; } } catch (Throwable e) { - logger.error("arthas", "logger command update log4j level error", e); + logger.error("logger command update log4j level error", e); } try { @@ -152,7 +152,7 @@ public class LoggerCommand extends AnnotatedCommand { result = true; } } catch (Throwable e) { - logger.error("arthas", "logger command update logback level error", e); + logger.error("logger command update logback level error", e); } try { @@ -161,7 +161,7 @@ public class LoggerCommand extends AnnotatedCommand { result = true; } } catch (Throwable e) { - logger.error("arthas", "logger command update log4j2 level error", e); + logger.error("logger command update log4j2 level error", e); } if (result) { @@ -324,7 +324,7 @@ public class LoggerCommand extends AnnotatedCommand { helperClass.getName(), helperClassName); ReflectUtils.defineClass(helperClassName, helperClassBytes, classLoader); } catch (Throwable e1) { - logger.error("arthas", "arthas loggger command try to define helper class error: " + helperClassName, + logger.error("arthas loggger command try to define helper class error: " + helperClassName, e1); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java index f5d25a610..ce2e784f7 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.command.monitor200; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.Advice; import com.taobao.arthas.core.advisor.ArthasMethod; import com.taobao.arthas.core.advisor.ReflectAdviceListenerAdapter; @@ -11,7 +13,7 @@ import com.taobao.arthas.core.util.ThreadLocalWatch; * @author ralf0131 2017-01-06 16:02. */ public class AbstractTraceAdviceListener extends ReflectAdviceListenerAdapter { - + private static final Logger logger = LoggerFactory.getLogger(AbstractTraceAdviceListener.class); protected final ThreadLocalWatch threadLocalWatch = new ThreadLocalWatch(); protected TraceCommand command; protected CommandProcess process; @@ -84,9 +86,9 @@ public class AbstractTraceAdviceListener extends ReflectAdviceListenerAdapter { } } } catch (Throwable e) { - LogUtil.getArthasLogger().warn("trace failed.", e); + logger.warn("trace failed.", e); process.write("trace failed, condition is: " + command.getConditionExpress() + ", " + e.getMessage() - + ", visit " + LogUtil.LOGGER_FILE + " for more details.\n"); + + ", visit " + LogUtil.loggingFile() + " for more details.\n"); process.end(); } finally { threadBoundEntity.remove(); diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java index 1733f3a2b..a6f331397 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/DashboardCommand.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.command.monitor200; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.taobao.arthas.core.command.Constants; @@ -8,7 +10,6 @@ import com.taobao.arthas.core.shell.command.CommandProcess; import com.taobao.arthas.core.shell.handlers.Handler; import com.taobao.arthas.core.shell.handlers.shell.QExitHandler; import com.taobao.arthas.core.shell.session.Session; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.NetUtils; import com.taobao.arthas.core.util.NetUtils.Response; import com.taobao.arthas.core.util.ThreadUtil; @@ -17,7 +18,6 @@ import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Color; import com.taobao.text.Decoration; import com.taobao.text.Style; @@ -49,7 +49,7 @@ import java.util.TimerTask; Constants.WIKI + Constants.WIKI_HOME + "dashboard") public class DashboardCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(DashboardCommand.class); private SumRateCounter tomcatRequestCounter = new SumRateCounter(); private SumRateCounter tomcatErrorCounter = new SumRateCounter(); @@ -303,7 +303,7 @@ public class DashboardCommand extends AnnotatedCommand { addTomcatInfo(tomcatInfoTable); } } catch (Throwable t) { - logger.error(null, "get Tomcat Info error!", t); + logger.error("get Tomcat Info error!", t); } if (tomcatInfoTable != null) { diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java index bc57b17d2..a55f4a09e 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java @@ -5,6 +5,8 @@ import java.lang.instrument.UnmodifiableClassException; import java.util.Collections; import java.util.List; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.advisor.Enhancer; import com.taobao.arthas.core.advisor.InvokeTraceable; @@ -19,14 +21,13 @@ import com.taobao.arthas.core.util.Constants; import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.affect.EnhancerAffect; import com.taobao.arthas.core.util.matcher.Matcher; -import com.taobao.middleware.logger.Logger; /** * @author beiwei30 on 29/11/2016. */ public abstract class EnhancerCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(EnhancerCommand.class); protected static final List EMPTY = Collections.emptyList(); public static final String[] EXPRESS_EXAMPLES = { "params", "returnObj", "throwExp", "target", "clazz", "method", "{params,returnObj}", "params[0]" }; @@ -117,7 +118,7 @@ public abstract class EnhancerCommand extends AnnotatedCommand { process.write("No class or method is affected, try:\n" + "1. sm CLASS_NAME METHOD_NAME to make sure the method you are tracing actually exists (it might be in your parent class).\n" + "2. reset CLASS_NAME and try again, your method body might be too large.\n" - + "3. check arthas log: " + LogUtil.LOGGER_FILE + "\n" + + "3. check arthas log: " + LogUtil.loggingFile() + "\n" + "4. visit https://github.com/alibaba/arthas/issues/47 for more details.\n"); process.end(); return; @@ -134,7 +135,7 @@ public abstract class EnhancerCommand extends AnnotatedCommand { process.write(effect + "\n"); } catch (UnmodifiableClassException e) { - logger.error(null, "error happens when enhancing class", e); + logger.error("error happens when enhancing class", e); } finally { if (session.getLock() == lock) { // enhance结束后解锁 @@ -148,7 +149,7 @@ public abstract class EnhancerCommand extends AnnotatedCommand { } private static void warn(CommandProcess process, String message) { - logger.error(null, message); + logger.error(message); process.write("cannot operate the current command, pls. check arthas.log\n"); if (process.isForeground()) { process.echoTips(Constants.Q_OR_CTRL_C_ABORT_MSG + "\n"); diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java index 39d07d88b..d1acf4a41 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/HeapDumpCommand.java @@ -6,17 +6,17 @@ import java.lang.management.ManagementFactory; import java.text.SimpleDateFormat; import java.util.Date; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.sun.management.HotSpotDiagnosticMXBean; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.middleware.cli.annotations.Argument; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; /** * HeapDump command @@ -29,7 +29,7 @@ import com.taobao.middleware.logger.Logger; @Description("\nExamples:\n" + " heapdump\n" + " heapdump --live\n" + " heapdump --live /tmp/dump.hprof\n" + Constants.WIKI + Constants.WIKI_HOME + "heapdump") public class HeapDumpCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(HeapDumpCommand.class); private String file; private boolean live; @@ -65,7 +65,7 @@ public class HeapDumpCommand extends AnnotatedCommand { process.write("Heap dump file created\n"); } catch (Throwable t) { - logger.error("arthas", "heap dump error", t); + logger.error("heap dump error", t); process.write("Heap dump error: " + t.getMessage() + '\n'); status = 1; } finally { diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/MBeanCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/MBeanCommand.java index 2a0b37ac3..12f7d1575 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/MBeanCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/MBeanCommand.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.command.monitor200; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.cli.CliToken; import com.taobao.arthas.core.shell.cli.Completion; @@ -10,7 +12,6 @@ import com.taobao.arthas.core.shell.handlers.Handler; import com.taobao.arthas.core.shell.handlers.command.CommandInterruptHandler; import com.taobao.arthas.core.shell.handlers.shell.QExitHandler; import com.taobao.arthas.core.shell.session.Session; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.StringUtils; import com.taobao.arthas.core.util.TokenUtils; import com.taobao.arthas.core.util.matcher.Matcher; @@ -21,7 +22,6 @@ import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Color; import com.taobao.text.Decoration; import com.taobao.text.ui.LabelElement; @@ -72,7 +72,7 @@ import static javax.management.MBeanOperationInfo.UNKNOWN; Constants.WIKI + Constants.WIKI_HOME + "mbean") public class MBeanCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(MBeanCommand.class); private String name; private String attribute; diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/PerfCounterCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/PerfCounterCommand.java index 98491c177..d0eb9ae29 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/PerfCounterCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/PerfCounterCommand.java @@ -7,17 +7,17 @@ import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.common.JavaVersionUtils; import com.taobao.arthas.common.PidUtils; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Decoration; import com.taobao.text.ui.TableElement; import com.taobao.text.util.RenderUtil; @@ -34,7 +34,7 @@ import sun.management.counter.perf.PerfInstrumentation; @Summary("Display the perf counter infornation.") @Description(Constants.WIKI + Constants.WIKI_HOME + "perf") public class PerfCounterCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(PerfCounterCommand.class); private static Object perfObject; private static Method attachMethod; @@ -113,7 +113,7 @@ public class PerfCounterCommand extends AnnotatedCommand { PerfInstrumentation perfInstrumentation = new PerfInstrumentation(buffer); return perfInstrumentation.getAllCounters(); } catch (Throwable e) { - logger.error("arthas", "get perf counter error", e); + logger.error("get perf counter error", e); } return Collections.emptyList(); } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java index fd14bb5a8..ef057ba4c 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java @@ -11,6 +11,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.common.OSUtils; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.cli.CliToken; @@ -18,14 +20,12 @@ import com.taobao.arthas.core.shell.cli.Completion; import com.taobao.arthas.core.shell.cli.CompletionUtils; import com.taobao.arthas.core.shell.command.AnnotatedCommand; import com.taobao.arthas.core.shell.command.CommandProcess; -import com.taobao.arthas.core.util.LogUtil; import com.taobao.middleware.cli.annotations.Argument; import com.taobao.middleware.cli.annotations.DefaultValue; import com.taobao.middleware.cli.annotations.Description; import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; -import com.taobao.middleware.logger.Logger; import one.profiler.AsyncProfiler; import one.profiler.Counter; @@ -58,7 +58,7 @@ import one.profiler.Counter; + Constants.WIKI + Constants.WIKI_HOME + "profiler") //@formatter:on public class ProfilerCommand extends AnnotatedCommand { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(ProfilerCommand.class); private String action; private String actionArg; @@ -113,7 +113,7 @@ public class ProfilerCommand extends AnnotatedCommand { libPath = soFile.getAbsolutePath(); } } catch (Throwable e) { - logger.error("arthas", "can not find libasyncProfiler so", e); + logger.error("can not find libasyncProfiler so", e); } } } @@ -332,7 +332,7 @@ public class ProfilerCommand extends AnnotatedCommand { } } catch (Throwable e) { process.write(e.getMessage()).write("\n"); - logger.error("arthas", "AsyncProfiler error", e); + logger.error("AsyncProfiler error", e); status = 1; } finally { process.end(status); diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java index d5aaa8bb2..a5f73aa7c 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java @@ -2,19 +2,20 @@ package com.taobao.arthas.core.command.monitor200; import com.taobao.arthas.core.advisor.ReflectAdviceListenerAdapter; import com.taobao.arthas.core.shell.command.CommandProcess; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.Advice; import com.taobao.arthas.core.advisor.ArthasMethod; import com.taobao.arthas.core.util.DateUtils; import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.ThreadLocalWatch; import com.taobao.arthas.core.util.ThreadUtil; -import com.taobao.middleware.logger.Logger; /** * @author beiwei30 on 29/11/2016. */ public class StackAdviceListener extends ReflectAdviceListenerAdapter { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(StackAdviceListener.class); private final ThreadLocal stackThreadLocal = new ThreadLocal(); private final ThreadLocalWatch threadLocalWatch = new ThreadLocalWatch(); @@ -63,7 +64,7 @@ public class StackAdviceListener extends ReflectAdviceListenerAdapter { } catch (Exception e) { logger.warn("stack failed.", e); process.write("stack failed, condition is: " + command.getConditionExpress() + ", " + e.getMessage() - + ", visit " + LogUtil.LOGGER_FILE + " for more details.\n"); + + ", visit " + LogUtil.loggingFile() + " for more details.\n"); process.end(); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java index 778d831d7..09bc7c3ed 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java @@ -3,6 +3,8 @@ package com.taobao.arthas.core.command.monitor200; import com.taobao.arthas.core.advisor.ReflectAdviceListenerAdapter; import com.taobao.arthas.core.command.express.ExpressException; import com.taobao.arthas.core.shell.command.CommandProcess; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.Advice; import com.taobao.arthas.core.advisor.ArthasMethod; import com.taobao.arthas.core.util.LogUtil; @@ -20,7 +22,7 @@ import static com.taobao.arthas.core.command.monitor200.TimeTunnelTable.fillTabl * @author beiwei30 on 30/11/2016. */ public class TimeTunnelAdviceListener extends ReflectAdviceListenerAdapter { - + private static final Logger logger = LoggerFactory.getLogger(TimeTunnelAdviceListener.class); private TimeTunnelCommand command; private CommandProcess process; @@ -61,9 +63,9 @@ public class TimeTunnelAdviceListener extends ReflectAdviceListenerAdapter { try { match = isConditionMet(command.getConditionExpress(), advice, cost); } catch (ExpressException e) { - LogUtil.getArthasLogger().warn("tt failed.", e); + logger.warn("tt failed.", e); process.write("tt failed, condition is: " + command.getConditionExpress() + ", " + e.getMessage() - + ", visit " + LogUtil.LOGGER_FILE + " for more details.\n"); + + ", visit " + LogUtil.loggingFile() + " for more details.\n"); process.end(); } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java index 7ec3ef8d7..a6c2fbaeb 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.command.monitor200; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.Advice; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.advisor.ArthasMethod; @@ -20,7 +22,6 @@ import com.taobao.middleware.cli.annotations.Name; import com.taobao.middleware.cli.annotations.Option; import com.taobao.middleware.cli.annotations.Summary; import com.taobao.middleware.cli.annotations.Argument; -import com.taobao.middleware.logger.Logger; import com.taobao.text.ui.TableElement; import com.taobao.text.util.RenderUtil; @@ -79,7 +80,7 @@ public class TimeTunnelCommand extends EnhancerCommand { private int numberOfLimit = 100; private int replayTimes = 1; private long replayInterval = 1000L; - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(TimeTunnelCommand.class); @Argument(index = 0, argName = "class-pattern", required = false) @Description("Path and classname of Pattern Matching") @@ -365,7 +366,7 @@ public class TimeTunnelCommand extends EnhancerCommand { affect.rCnt(1); } catch (ExpressException e) { logger.warn("tt failed.", e); - process.write(e.getMessage() + ", visit " + LogUtil.LOGGER_FILE + " for more detail\n"); + process.write(e.getMessage() + ", visit " + LogUtil.loggingFile() + " for more detail\n"); } finally { process.write(affect.toString()).write("\n"); process.end(); @@ -402,8 +403,8 @@ public class TimeTunnelCommand extends EnhancerCommand { affect.rCnt(matchingTimeSegmentMap.size()); } catch (ExpressException e) { - LogUtil.getArthasLogger().warn("tt failed.", e); - process.write(e.getMessage() + ", visit " + LogUtil.LOGGER_FILE + " for more detail\n"); + logger.warn("tt failed.", e); + process.write(e.getMessage() + ", visit " + LogUtil.loggingFile() + " for more detail\n"); } finally { process.write(affect.toString()).write("\n"); process.end(); diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java index 7bda4dcce..a516fe59d 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.command.monitor200; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.Advice; import com.taobao.arthas.core.advisor.ArthasMethod; import com.taobao.arthas.core.advisor.ReflectAdviceListenerAdapter; @@ -9,14 +11,13 @@ import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.StringUtils; import com.taobao.arthas.core.util.ThreadLocalWatch; import com.taobao.arthas.core.view.ObjectView; -import com.taobao.middleware.logger.Logger; /** * @author beiwei30 on 29/11/2016. */ class WatchAdviceListener extends ReflectAdviceListenerAdapter { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(WatchAdviceListener.class); private final ThreadLocalWatch threadLocalWatch = new ThreadLocalWatch(); private WatchCommand command; private CommandProcess process; @@ -91,7 +92,7 @@ class WatchAdviceListener extends ReflectAdviceListenerAdapter { } catch (Exception e) { logger.warn("watch failed.", e); process.write("watch failed, condition is: " + command.getConditionExpress() + ", express is: " - + command.getExpress() + ", " + e.getMessage() + ", visit " + LogUtil.LOGGER_FILE + + command.getExpress() + ", " + e.getMessage() + ", visit " + LogUtil.loggingFile() + " for more details.\n"); process.end(); } diff --git a/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java b/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java index 3bf10784d..9dd1c2efd 100644 --- a/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java +++ b/core/src/main/java/com/taobao/arthas/core/server/ArthasBootstrap.java @@ -19,7 +19,11 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import com.alibaba.arthas.deps.ch.qos.logback.classic.LoggerContext; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.alibaba.arthas.tunnel.client.TunnelClient; +import com.taobao.arthas.common.AnsiLog; import com.taobao.arthas.common.PidUtils; import com.taobao.arthas.core.advisor.AdviceWeaver; import com.taobao.arthas.core.command.BuiltinCommandPack; @@ -42,7 +46,6 @@ import com.taobao.arthas.core.util.Constants; import com.taobao.arthas.core.util.FileUtils; import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.UserStatUtil; -import com.taobao.middleware.logger.Logger; import io.netty.channel.ChannelFuture; @@ -51,15 +54,17 @@ import io.netty.channel.ChannelFuture; * @author vlinux on 15/5/2. */ public class ArthasBootstrap { + public static final String ARTHAS_HOME_PROPERTY = "arthas.home"; + private static String ARTHAS_SHOME = null; public static final String CONFIG_NAME_PROPERTY = "arthas.config.name"; public static final String CONFIG_LOCATION_PROPERTY = "arthas.config.location"; public static final String CONFIG_OVERRIDE_ALL= "arthas.config.overrideAll"; - private static Logger logger = LogUtil.getArthasLogger(); private static ArthasBootstrap arthasBootstrap; private ArthasEnvironment arthasEnvironment; + private Configure configure; private AtomicBoolean isBindRef = new AtomicBoolean(false); private Instrumentation instrumentation; @@ -70,13 +75,25 @@ public class ArthasBootstrap { private File arthasOutputDir; - private ArthasBootstrap(Instrumentation instrumentation) { + private static LoggerContext loggerContext; + + private ArthasBootstrap(Instrumentation instrumentation, String args) throws Throwable { this.instrumentation = instrumentation; String outputPath = System.getProperty("arthas.output.dir", "arthas-output"); arthasOutputDir = new File(outputPath); arthasOutputDir.mkdirs(); + // 1. initSpy() + initSpy(); + // 2. ArthasEnvironment + initArthasEnvironment(args); + // 3. init logger + loggerContext = LogUtil.initLooger(arthasEnvironment); + + // 4. start agent server + bind(configure); + executorService = Executors.newCachedThreadPool(new ThreadFactory() { @Override public Thread newThread(Runnable r) { @@ -109,9 +126,7 @@ public class ArthasBootstrap { Spy.init(AdviceWeaver.class.getClassLoader(), onBefore, onReturn, onThrows, beforeInvoke, afterInvoke, throwInvoke); } - public void bind(String args) throws Throwable { - initSpy(); - + private void initArthasEnvironment(String args) throws IOException { if (arthasEnvironment == null) { arthasEnvironment = new ArthasEnvironment(); } @@ -129,16 +144,33 @@ public class ArthasBootstrap { for (Entry entry : argsMap.entrySet()) { mapWithPrefix.put("arthas." + entry.getKey(), entry.getValue()); } + mapWithPrefix.put(ARTHAS_HOME_PROPERTY, arthasHome()); MapPropertySource mapPropertySource = new MapPropertySource("args", mapWithPrefix); arthasEnvironment.addFirst(mapPropertySource); tryToLoadArthasProperties(); - Configure configure = new Configure(); + configure = new Configure(); BinderUtils.inject(arthasEnvironment, configure); + } - bind(configure); + private String arthasHome() { + if (ARTHAS_SHOME != null) { + return ARTHAS_SHOME; + } + CodeSource codeSource = ArthasBootstrap.class.getProtectionDomain().getCodeSource(); + if (codeSource != null) { + try { + ARTHAS_SHOME = new File(codeSource.getLocation().toURI().getSchemeSpecificPart()).getParentFile().getAbsolutePath(); + } catch (Throwable e) { + AnsiLog.error("try to load arthas.properties error", e); + } + } + if (ARTHAS_SHOME == null) { + ARTHAS_SHOME = new File("").getAbsolutePath(); + } + return ARTHAS_SHOME; } // try to load arthas.properties @@ -152,14 +184,7 @@ public class ArthasBootstrap { } if (location == null) { - CodeSource codeSource = ArthasBootstrap.class.getProtectionDomain().getCodeSource(); - if (codeSource != null) { - try { - location = new File(codeSource.getLocation().toURI().getSchemeSpecificPart()).getAbsolutePath(); - } catch (Throwable e) { - logger.error("arthas", "can not find libasyncProfiler so", e); - } - } + location = arthasHome(); } String configName = "arthas"; @@ -179,6 +204,8 @@ public class ArthasBootstrap { boolean overrideAll = false; if (arthasEnvironment.containsProperty(CONFIG_OVERRIDE_ALL)) { overrideAll = arthasEnvironment.getRequiredProperty(CONFIG_OVERRIDE_ALL, boolean.class); + } else { + overrideAll = Boolean.parseBoolean(properties.getProperty(CONFIG_OVERRIDE_ALL, "false")); } PropertySource propertySource = new PropertiesPropertySource(location, properties); @@ -224,7 +251,7 @@ public class ArthasBootstrap { } } } catch (Throwable t) { - logger.error("arthas", "start tunnel client error", t); + logger().error("start tunnel client error", t); } try { @@ -247,13 +274,13 @@ public class ArthasBootstrap { shellServer.registerTermServer(new HttpTelnetTermServer(configure.getIp(), configure.getTelnetPort(), options.getConnectionTimeout())); } else { - logger.info("telnet port is {}, skip bind telnet server.", configure.getTelnetPort()); + logger().info("telnet port is {}, skip bind telnet server.", configure.getTelnetPort()); } if (configure.getHttpPort() > 0) { shellServer.registerTermServer(new HttpTermServer(configure.getIp(), configure.getHttpPort(), options.getConnectionTimeout())); } else { - logger.info("http port is {}, skip bind http server.", configure.getHttpPort()); + logger().info("http port is {}, skip bind http server.", configure.getHttpPort()); } for (CommandResolver resolver : resolvers) { @@ -262,18 +289,18 @@ public class ArthasBootstrap { shellServer.listen(new BindHandler(isBindRef)); - logger.info("as-server listening on network={};telnet={};http={};timeout={};", configure.getIp(), + logger().info("as-server listening on network={};telnet={};http={};timeout={};", configure.getIp(), configure.getTelnetPort(), configure.getHttpPort(), options.getConnectionTimeout()); // 异步回报启动次数 if (configure.getStatUrl() != null) { - logger.info("arthas stat url: {}", configure.getStatUrl()); + logger().info("arthas stat url: {}", configure.getStatUrl()); } UserStatUtil.setStatUrl(configure.getStatUrl()); UserStatUtil.arthasStart(); - logger.info("as-server started in {} ms", System.currentTimeMillis() - start ); + logger().info("as-server started in {} ms", System.currentTimeMillis() - start ); } catch (Throwable e) { - logger.error(null, "Error during bind to port " + configure.getTelnetPort(), e); + logger().error("Error during bind to port " + configure.getTelnetPort(), e); if (shellServer != null) { shellServer.close(); } @@ -295,7 +322,7 @@ public class ArthasBootstrap { try { tunnelClient.stop(); } catch (Throwable e) { - logger.error("arthas", "stop tunnel client error", e); + logger().error("arthas", "stop tunnel client error", e); } } executorService.shutdownNow(); @@ -307,9 +334,10 @@ public class ArthasBootstrap { } catch (Throwable t) { // ignore } - logger.info("as-server destroy completed."); - // see https://github.com/alibaba/arthas/issues/319 - LogUtil.closeResultLogger(); + logger().info("as-server destroy completed."); + if (loggerContext != null) { + loggerContext.stop(); + } } /** @@ -317,10 +345,11 @@ public class ArthasBootstrap { * * @param instrumentation JVM增强 * @return ArthasServer单例 + * @throws Throwable */ - public synchronized static ArthasBootstrap getInstance(Instrumentation instrumentation) { + public synchronized static ArthasBootstrap getInstance(Instrumentation instrumentation, String args) throws Throwable { if (arthasBootstrap == null) { - arthasBootstrap = new ArthasBootstrap(instrumentation); + arthasBootstrap = new ArthasBootstrap(instrumentation, args); } return arthasBootstrap; } @@ -348,13 +377,17 @@ public class ArthasBootstrap { Method agentDestroyMethod = spyClass.getMethod("destroy"); agentDestroyMethod.invoke(null); } catch (ClassNotFoundException e) { - logger.error(null, "Spy load failed from ArthasClassLoader, which should not happen", e); + logger().error("Spy load failed from ArthasClassLoader, which should not happen", e); } catch (Exception e) { - logger.error(null, "Spy destroy failed: ", e); + logger().error("Spy destroy failed: ", e); } } public TunnelClient getTunnelClient() { return tunnelClient; } + + private Logger logger() { + return LoggerFactory.getLogger(this.getClass()); + } } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/handlers/BindHandler.java b/core/src/main/java/com/taobao/arthas/core/shell/handlers/BindHandler.java index 36cc31c68..cee1714ab 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/handlers/BindHandler.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/handlers/BindHandler.java @@ -1,8 +1,8 @@ package com.taobao.arthas.core.shell.handlers; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.future.Future; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class BindHandler implements Handler> { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(BindHandler.class); private AtomicBoolean isBindRef; @@ -22,7 +22,7 @@ public class BindHandler implements Handler> { @Override public void handle(Future event) { if (event.failed()) { - logger.error(null, "Error listening term server:", event.cause()); + logger.error("Error listening term server:", event.cause()); isBindRef.compareAndSet(true, false); } } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/handlers/NoOpHandler.java b/core/src/main/java/com/taobao/arthas/core/shell/handlers/NoOpHandler.java index 74e363708..3c80c8c0a 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/handlers/NoOpHandler.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/handlers/NoOpHandler.java @@ -1,20 +1,20 @@ package com.taobao.arthas.core.shell.handlers; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.future.Future; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; /** * @author beiwei30 on 22/11/2016. */ public class NoOpHandler implements Handler { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(NoOpHandler.class); @Override public void handle(Object event) { if (event instanceof Future && ((Future) event).failed()) { - logger.error(null, "Error listening term server:", ((Future) event).cause()); + logger.error("Error listening term server:", ((Future) event).cause()); } } } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java index 01120c4ea..cdd8bad73 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellImpl.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.shell.impl; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.Shell; import com.taobao.arthas.core.shell.ShellServer; import com.taobao.arthas.core.shell.cli.CliToken; @@ -19,8 +21,7 @@ import com.taobao.arthas.core.shell.system.JobController; import com.taobao.arthas.core.shell.system.impl.InternalCommandManager; import com.taobao.arthas.core.shell.system.impl.JobControllerImpl; import com.taobao.arthas.core.shell.term.Term; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; import java.lang.instrument.Instrumentation; import java.util.Date; @@ -35,7 +36,7 @@ import java.util.UUID; */ public class ShellImpl implements Shell { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(ShellImpl.class); private JobControllerImpl jobController; final String id; diff --git a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java index 444e42e58..e02e23b55 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/impl/ShellServerImpl.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.shell.impl; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.server.ArthasBootstrap; import com.taobao.arthas.core.shell.Shell; import com.taobao.arthas.core.shell.ShellServer; @@ -17,8 +19,7 @@ import com.taobao.arthas.core.shell.system.impl.InternalCommandManager; import com.taobao.arthas.core.shell.system.impl.JobControllerImpl; import com.taobao.arthas.core.shell.term.Term; import com.taobao.arthas.core.shell.term.TermServer; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; import java.lang.instrument.Instrumentation; import java.util.ArrayList; @@ -40,7 +41,7 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class ShellServerImpl extends ShellServer { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(ShellServerImpl.class); private final CopyOnWriteArrayList resolvers; private final InternalCommandManager commandManager; @@ -177,7 +178,7 @@ public class ShellServerImpl extends ShellServer { if (job != null) { // close shell's foreground job job.terminate(); - logger.info(null, "Session {} closed, so terminate foreground job, id: {}, line: {}", + logger.info("Session {} closed, so terminate foreground job, id: {}, line: {}", shell.session().getSessionId(), job.id(), job.line()); } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/system/impl/GlobalJobControllerImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/system/impl/GlobalJobControllerImpl.java index 61545fa59..e408879f6 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/system/impl/GlobalJobControllerImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/system/impl/GlobalJobControllerImpl.java @@ -8,13 +8,14 @@ import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.TimeUnit; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.shell.cli.CliToken; import com.taobao.arthas.core.shell.handlers.Handler; import com.taobao.arthas.core.shell.impl.ShellImpl; import com.taobao.arthas.core.shell.system.Job; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; /** * 全局的Job Controller,不应该存在启停的概念,不需要在连接的断开时关闭, @@ -25,7 +26,7 @@ public class GlobalJobControllerImpl extends JobControllerImpl { private Timer timer = new Timer("job-timeout", true); private Map jobTimeoutTaskMap = new HashMap(); - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(GlobalJobControllerImpl.class); @Override public void close(final Handler completionHandler) { diff --git a/core/src/main/java/com/taobao/arthas/core/shell/system/impl/JobControllerImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/system/impl/JobControllerImpl.java index d7a0c200d..eedbddf7f 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/system/impl/JobControllerImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/system/impl/JobControllerImpl.java @@ -15,6 +15,7 @@ import com.taobao.arthas.core.shell.system.Process; import com.taobao.arthas.core.shell.system.impl.ProcessImpl.ProcessOutput; import com.taobao.arthas.core.shell.term.Term; import com.taobao.arthas.core.util.Constants; +import com.taobao.arthas.core.util.LogUtil; import com.taobao.arthas.core.util.TokenUtils; import io.termd.core.function.Function; @@ -171,7 +172,7 @@ public class JobControllerImpl implements JobController { String name = getRedirectFileName(tokens); if (name == null) { // 如果没有指定重定向文件名,那么重定向到以jobid命名的缓存中 - name = Constants.CACHE_ROOT + File.separator + Constants.PID + File.separator + jobId; + name = LogUtil.cacheDir() + File.separator + Constants.PID + File.separator + jobId; cacheLocation = name; if (getRedirectJobCount() == 8) { diff --git a/core/src/main/java/com/taobao/arthas/core/shell/system/impl/ProcessImpl.java b/core/src/main/java/com/taobao/arthas/core/shell/system/impl/ProcessImpl.java index d457129c9..f145cf97c 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/system/impl/ProcessImpl.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/system/impl/ProcessImpl.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core.shell.system.impl; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.advisor.AdviceWeaver; import com.taobao.arthas.core.server.ArthasBootstrap; @@ -13,12 +15,11 @@ import com.taobao.arthas.core.shell.session.Session; import com.taobao.arthas.core.shell.system.ExecStatus; import com.taobao.arthas.core.shell.system.Process; import com.taobao.arthas.core.shell.term.Tty; -import com.taobao.arthas.core.util.LogUtil; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; import com.taobao.arthas.core.util.usage.StyledUsageFormatter; import com.taobao.middleware.cli.CLIException; import com.taobao.middleware.cli.CommandLine; import com.taobao.middleware.cli.UsageMessageFormatter; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Color; import io.termd.core.function.Function; @@ -33,7 +34,7 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class ProcessImpl implements Process { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(ProcessImpl.class); private Command commandContext; private Handler handler; @@ -369,7 +370,7 @@ public class ProcessImpl implements Process { try { handler.handle(process); } catch (Throwable t) { - logger.error(null, "Error during processing the command:", t); + logger.error("Error during processing the command:", t); process.write("Error during processing the command: " + t.getMessage() + "\n"); terminate(1, null); } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/CompletionHandler.java b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/CompletionHandler.java index 8c3205c8d..41c2a90f5 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/CompletionHandler.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/CompletionHandler.java @@ -1,11 +1,12 @@ package com.taobao.arthas.core.shell.term.impl; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.cli.CliToken; import com.taobao.arthas.core.shell.cli.CliTokens; import com.taobao.arthas.core.shell.handlers.Handler; import com.taobao.arthas.core.shell.session.Session; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; import io.termd.core.function.Consumer; import io.termd.core.readline.Completion; @@ -17,7 +18,7 @@ import java.util.List; * @author beiwei30 on 23/11/2016. */ class CompletionHandler implements Consumer { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(CompletionHandler.class); private final Handler completionHandler; private final Session session; @@ -35,7 +36,7 @@ class CompletionHandler implements Consumer { completionHandler.handle(comp); } catch (Throwable t) { // t.printStackTrace(); - logger.error(null, "completion error", t); + logger.error("completion error", t); } } } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/Helper.java b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/Helper.java index 1f3b369c5..c74322043 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/Helper.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/Helper.java @@ -1,9 +1,10 @@ package com.taobao.arthas.core.shell.term.impl; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.ShellServerOptions; import com.taobao.arthas.core.shell.term.TermServer; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; import io.termd.core.readline.Keymap; import java.io.FileInputStream; @@ -14,7 +15,7 @@ import java.io.InputStream; */ public class Helper { - private static Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(Helper.class); public static Keymap loadKeymap() { return new Keymap(loadInputRcFile()); diff --git a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/HttpTermServer.java b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/HttpTermServer.java index 002305b17..2ad5f6288 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/HttpTermServer.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/HttpTermServer.java @@ -1,12 +1,13 @@ package com.taobao.arthas.core.shell.term.impl; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.future.Future; import com.taobao.arthas.core.shell.handlers.Handler; import com.taobao.arthas.core.shell.term.Term; import com.taobao.arthas.core.shell.term.TermServer; import com.taobao.arthas.core.shell.term.impl.http.NettyWebsocketTtyBootstrap; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; import io.termd.core.function.Consumer; import io.termd.core.tty.TtyConnection; @@ -17,7 +18,7 @@ import java.util.concurrent.TimeUnit; */ public class HttpTermServer extends TermServer { - private static Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(HttpTermServer.class); private Handler termHandler; private NettyWebsocketTtyBootstrap bootstrap; @@ -50,7 +51,7 @@ public class HttpTermServer extends TermServer { }).get(connectionTimeout, TimeUnit.MILLISECONDS); listenHandler.handle(Future.succeededFuture()); } catch (Throwable t) { - logger.error(null, "Error listening to port " + port, t); + logger.error("Error listening to port " + port, t); listenHandler.handle(Future.failedFuture(t)); } return this; diff --git a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/TelnetTermServer.java b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/TelnetTermServer.java index b18a1461a..585c2b9cf 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/TelnetTermServer.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/TelnetTermServer.java @@ -1,11 +1,11 @@ package com.taobao.arthas.core.shell.term.impl; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.core.shell.future.Future; import com.taobao.arthas.core.shell.handlers.Handler; import com.taobao.arthas.core.shell.term.Term; import com.taobao.arthas.core.shell.term.TermServer; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; import io.termd.core.function.Consumer; import io.termd.core.telnet.netty.NettyTelnetTtyBootstrap; import io.termd.core.tty.TtyConnection; @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; */ public class TelnetTermServer extends TermServer { - private static Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(TelnetTermServer.class); private NettyTelnetTtyBootstrap bootstrap; private String hostIp; @@ -53,7 +53,7 @@ public class TelnetTermServer extends TermServer { }).get(connectionTimeout, TimeUnit.MILLISECONDS); listenHandler.handle(Future.succeededFuture()); } catch (Throwable t) { - logger.error(null, "Error listening to port " + port, t); + logger.error("Error listening to port " + port, t); listenHandler.handle(Future.failedFuture(t)); } return this; diff --git a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/http/HttpRequestHandler.java b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/http/HttpRequestHandler.java index eb98a4e4a..8c101168e 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/term/impl/http/HttpRequestHandler.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/term/impl/http/HttpRequestHandler.java @@ -5,9 +5,10 @@ import java.io.InputStream; import java.net.URI; import java.net.URL; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.common.IOUtils; -import com.taobao.arthas.core.util.LogUtil; -import com.taobao.middleware.logger.Logger; +import com.taobao.arthas.core.shell.term.impl.httptelnet.HttpTelnetTermServer; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; @@ -31,7 +32,7 @@ import io.termd.core.util.Logging; * @author hengyunabc 2019-11-06 */ public class HttpRequestHandler extends SimpleChannelInboundHandler { - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(HttpTelnetTermServer.class); private final String wsUri; @@ -103,7 +104,7 @@ public class HttpRequestHandler extends SimpleChannelInboundHandler termHandler; private NettyHttpTelnetTtyBootstrap bootstrap; @@ -55,7 +55,7 @@ public class HttpTelnetTermServer extends TermServer { }).get(connectionTimeout, TimeUnit.MILLISECONDS); listenHandler.handle(Future.succeededFuture()); } catch (Throwable t) { - logger.error(null, "Error listening to port " + port, t); + logger.error("Error listening to port " + port, t); listenHandler.handle(Future.failedFuture(t)); } return this; diff --git a/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java b/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java index a906c9116..01de9e121 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java +++ b/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java @@ -1,8 +1,9 @@ package com.taobao.arthas.core.util; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import com.taobao.arthas.common.PidUtils; import com.taobao.arthas.core.shell.ShellServerOptions; -import com.taobao.middleware.logger.Logger; import com.taobao.text.Color; import com.taobao.text.Decoration; import com.taobao.text.ui.TableElement; @@ -29,7 +30,7 @@ public class ArthasBanner { private static String VERSION = "unknown"; private static String THANKS = ""; - private static final Logger logger = LogUtil.getArthasLogger(); + private static final Logger logger = LoggerFactory.getLogger(ArthasBanner.class); static { try { diff --git a/core/src/main/java/com/taobao/arthas/core/util/Constants.java b/core/src/main/java/com/taobao/arthas/core/util/Constants.java index bd80e310b..5beb6b75e 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/Constants.java +++ b/core/src/main/java/com/taobao/arthas/core/util/Constants.java @@ -5,8 +5,6 @@ import java.io.File; import com.taobao.arthas.common.PidUtils; import com.taobao.arthas.core.view.Ansi; -import static com.taobao.arthas.core.util.LogUtil.LOGS_DIR; - /** * @author ralf0131 2016-12-28 16:20. */ @@ -53,9 +51,4 @@ public class Constants { */ public static final String PID = PidUtils.currentPid(); - /** - * 缓存目录 - */ - public static final String CACHE_ROOT = LOGS_DIR + File.separator + "arthas-cache"; - } diff --git a/core/src/main/java/com/taobao/arthas/core/util/LogUtil.java b/core/src/main/java/com/taobao/arthas/core/util/LogUtil.java index ae2f8a363..c9fd27ee9 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/LogUtil.java +++ b/core/src/main/java/com/taobao/arthas/core/util/LogUtil.java @@ -1,141 +1,137 @@ package com.taobao.arthas.core.util; -import com.taobao.middleware.logger.Level; -import com.taobao.middleware.logger.Logger; -import com.taobao.middleware.logger.LoggerFactory; -import com.taobao.middleware.logger.support.LogLog; -import com.taobao.middleware.logger.support.LoggerHelper; - import java.io.File; +import java.util.Iterator; + +import com.alibaba.arthas.deps.ch.qos.logback.classic.LoggerContext; +import com.alibaba.arthas.deps.ch.qos.logback.classic.joran.JoranConfigurator; +import com.alibaba.arthas.deps.ch.qos.logback.classic.spi.ILoggingEvent; +import com.alibaba.arthas.deps.ch.qos.logback.core.Appender; +import com.alibaba.arthas.deps.ch.qos.logback.core.rolling.RollingFileAppender; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; +import com.taobao.arthas.common.AnsiLog; +import com.taobao.arthas.core.env.ArthasEnvironment; /** - * Arthas日志 - * Created by vlinux on 15/3/8. + * + * @author hengyunabc + * */ public class LogUtil { - /** - * Arthas 内部日志Logger - */ - private static final Logger arthasLogger; - - private static final org.slf4j.Logger resultLogger; + public static final String LOGGING_CONFIG_PROPERTY = "arthas.logging.config"; + public static final String LOGGING_CONFIG = "${arthas.logging.config:${arthas.home}/logback.xml}"; /** - * 接管Netty的Logger + * The name of the property that contains the name of the log file. Names can be + * an exact location or relative to the current directory. */ - private static final Logger nettyLogger; + public static final String FILE_NAME_PROPERTY = "arthas.logging.file.name"; + public static final String ARTHAS_LOG_FILE = "ARTHAS_LOG_FILE"; /** - * 接管termd的Logger + * The name of the property that contains the directory where log files are + * written. */ - private static final Logger termdLogger; + public static final String FILE_PATH_PROPERTY = "arthas.logging.file.path"; + public static final String ARTHAS_LOG_PATH = "ARTHAS_LOG_PATH"; + + private static String logFile = ""; /** - * 接管tunnel client的Logger + *
+     * 1. 尝试从 arthas.logging.config 这个配置里加载 logback.xml
+     * 2. 尝试从 arthas.home 下面找 logback.xml
+     * 
+     * 可以用 arthas.logging.file.name 指定具体arthas.log的名字
+     * 可以用 arthas.logging.file.path 指定具体arthas.log的目录
+     * 
+     * 
+ * + * @param env */ - private static final Logger tunnelClientLogger; + public static LoggerContext initLooger(ArthasEnvironment env) { + String loggingConfig = env.resolvePlaceholders(LOGGING_CONFIG); + if (loggingConfig == null || loggingConfig.trim().isEmpty()) { + return null; + } + AnsiLog.debug("arthas logging file: " + loggingConfig); + File configFile = new File(loggingConfig); + if (!configFile.isFile()) { + AnsiLog.error("can not find arthas logging config: " + loggingConfig); + return null; + } - public static final String LOGGER_FILE; + try { + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + loggerContext.reset(); - /** - * default value is ~/logs - */ - public static String LOGS_DIR; - - /** - * default value is ~/logs/arthas - */ - public static String LOGS_ARTHAS_DIR; - - static { - detectArthasLogDirectory(); - LOGGER_FILE = LoggerHelper.getLogFile("arthas", "arthas.log"); - - LogLog.setQuietMode(true); - - LoggerHelper.setPattern("arthas-cache", "%d{yyyy-MM-dd HH:mm:ss.SSS}%n%m%n"); - - arthasLogger = LoggerFactory.getLogger("arthas"); - arthasLogger.activateAppenderWithTimeAndSizeRolling("arthas", "arthas.log", "UTF-8", "100MB"); - arthasLogger.setLevel(Level.INFO); - arthasLogger.setAdditivity(false); - - com.taobao.middleware.logger.Logger log = LoggerFactory.getLogger("result"); - log.activateAppenderWithSizeRolling("arthas-cache", "result.log", "UTF-8", "100MB", 3); - log.setAdditivity(false); - log.activateAsync(64, -1); - resultLogger = (org.slf4j.Logger) log.getDelegate(); - - nettyLogger = LoggerFactory.getLogger("io.netty"); - nettyLogger.activateAppender(arthasLogger); - nettyLogger.setLevel(Level.INFO); - nettyLogger.setAdditivity(false); - - termdLogger = LoggerFactory.getLogger("io.termd"); - termdLogger.activateAppender(arthasLogger); - termdLogger.setLevel(Level.INFO); - termdLogger.setAdditivity(false); - - tunnelClientLogger = LoggerFactory.getLogger("com.alibaba.arthas.tunnel.client"); - tunnelClientLogger.activateAppender(arthasLogger); - tunnelClientLogger.setLevel(Level.INFO); - tunnelClientLogger.setAdditivity(false); - } - - private static void detectArthasLogDirectory() { - String dpath = System.getProperty("JM.LOG.PATH"); - if (StringUtils.isEmpty(dpath)) { - File logDirectory = new File(System.getProperty("user.home") + File.separator + "logs" + File.separator); - try { - // when user is nobody mkdir will fail. #572 - logDirectory.mkdirs(); - } catch (Throwable e) { - // ignore + String fileName = env.getProperty(FILE_NAME_PROPERTY); + ; + if (fileName != null) { + loggerContext.putProperty(ARTHAS_LOG_FILE, fileName); } - if (!logDirectory.exists()) { - // try to set a temp directory - logDirectory = new File(System.getProperty("java.io.tmpdir") + File.separator + "logs" + File.separator); - try { - logDirectory.mkdirs(); - } catch (Throwable e) { - // ignore + String filePath = env.getProperty(FILE_PATH_PROPERTY); + if (filePath != null) { + loggerContext.putProperty(ARTHAS_LOG_PATH, filePath); + } + + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(loggerContext); + configurator.doConfigure(configFile.toURI().toURL()); // load logback xml file + + // 查找 arthas.log appender + Iterator> appenders = loggerContext.getLogger("root").iteratorForAppenders(); + + while (appenders.hasNext()) { + Appender appender = appenders.next(); + if (appender instanceof RollingFileAppender) { + RollingFileAppender fileAppender = (RollingFileAppender) appender; + if ("ARTHAS".equalsIgnoreCase(fileAppender.getName())) { + logFile = fileAppender.getFile(); + } } } - if (logDirectory.exists()) { - LOGS_DIR = logDirectory.getAbsolutePath(); - System.setProperty("JM.LOG.PATH", logDirectory.getAbsolutePath()); + + return loggerContext; + } catch (Throwable e) { + AnsiLog.error("try to load arthas logging config file error: " + configFile, e); + } + return null; + } + + public static String loggingFile() { + if (logFile == null || logFile.trim().isEmpty()) { + return "arthas.log"; + } + return logFile; + } + + public static String loggingDir() { + if (logFile != null && !logFile.isEmpty()) { + String parent = new File(logFile).getParent(); + if (parent != null) { + return parent; } + } + return new File("").getAbsolutePath(); + } + + public static String cacheDir() { + File logsDir = new File(loggingDir()).getParentFile(); + if (logsDir.exists()) { + File arthasCacheDir = new File(logsDir, "arthas-cache"); + arthasCacheDir.mkdirs(); + return arthasCacheDir.getAbsolutePath(); } else { - LOGS_DIR = dpath; + File arthasCacheDir = new File("arthas-cache"); + arthasCacheDir.mkdirs(); + return arthasCacheDir.getAbsolutePath(); } - if (StringUtils.isEmpty(LOGS_DIR)) { - LOGS_DIR = "logs"; - } - LOGS_ARTHAS_DIR = LOGS_DIR + File.separator + "arthas"; } - public static Logger getArthasLogger() { - return arthasLogger; - } - - public static org.slf4j.Logger getResultLogger() { - return resultLogger; - } - - public static void closeResultLogger() { - closeSlf4jLogger(resultLogger); - } - - public static void closeSlf4jLogger(org.slf4j.Logger logger) { - if (logger != null) { - if (logger instanceof ch.qos.logback.classic.Logger) { - ((ch.qos.logback.classic.Logger) logger).detachAndStopAllAppenders(); - } else { - // arthas strongly depends on logback. - // So do nothing here - // https://github.com/alibaba/arthas/issues/319 - } - } + public static Logger getResultLogger() { + return LoggerFactory.getLogger("result"); } } diff --git a/core/src/main/java/com/taobao/arthas/core/util/collection/ThreadUnsafeGaStack.java b/core/src/main/java/com/taobao/arthas/core/util/collection/ThreadUnsafeGaStack.java index c35b64fe1..d879f418d 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/collection/ThreadUnsafeGaStack.java +++ b/core/src/main/java/com/taobao/arthas/core/util/collection/ThreadUnsafeGaStack.java @@ -1,6 +1,7 @@ package com.taobao.arthas.core.util.collection; -import com.taobao.arthas.core.util.LogUtil; +import com.alibaba.arthas.deps.org.slf4j.Logger; +import com.alibaba.arthas.deps.org.slf4j.LoggerFactory; import java.util.NoSuchElementException; @@ -14,7 +15,7 @@ import static java.lang.System.arraycopy; * @param */ public class ThreadUnsafeGaStack implements GaStack { - + private static final Logger logger = LoggerFactory.getLogger(ThreadUnsafeGaStack.class); private final static int EMPTY_INDEX = -1; private final static int DEFAULT_STACK_DEEP = 12; @@ -38,8 +39,10 @@ public class ThreadUnsafeGaStack implements GaStack { private void ensureCapacityInternal(int expectDeep) { final int currentStackSize = elementArray.length; if (elementArray.length <= expectDeep) { - LogUtil.getArthasLogger().debug("resize GaStack to double length: " + currentStackSize * 2 + " for thread: " - + Thread.currentThread().getName()); + if (logger.isDebugEnabled()) { + logger.debug("resize GaStack to double length: " + currentStackSize * 2 + " for thread: " + + Thread.currentThread().getName()); + } final Object[] newElementArray = new Object[currentStackSize * 2]; arraycopy(elementArray, 0, newElementArray, 0, currentStackSize); this.elementArray = newElementArray; @@ -64,8 +67,9 @@ public class ThreadUnsafeGaStack implements GaStack { } finally { if (current == EMPTY_INDEX && elementArray.length > DEFAULT_STACK_DEEP) { elementArray = new Object[DEFAULT_STACK_DEEP]; - LogUtil.getArthasLogger().debug( - "resize GaStack to default length for thread: " + Thread.currentThread().getName()); + if (logger.isDebugEnabled()) { + logger.debug("resize GaStack to default length for thread: " + Thread.currentThread().getName()); + } } } } diff --git a/core/src/main/java/logback.xml b/core/src/main/java/logback.xml new file mode 100644 index 000000000..42f32d670 --- /dev/null +++ b/core/src/main/java/logback.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${ARTHAS_LOG_FILE} + + %date %level [%thread] %logger{10} [%file:%line] %msg%n + + + + ${ARTHAS_LOG_FILE}.%d{yyyy-MM-dd}.%i.log + + 7 + 1MB + 10MB + + + + + + ${RESULT_LOG_FILE} + + %date %level [%thread] %logger{10} [%file:%line] %msg%n + + + + ${RESULT_LOG_FILE}.%d{yyyy-MM-dd}.%i.log + + 7 + 1MB + 10MB + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/src/test/java/com/taobao/arthas/core/util/LogUtilTest.java b/core/src/test/java/com/taobao/arthas/core/util/LogUtilTest.java new file mode 100644 index 000000000..483497395 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/util/LogUtilTest.java @@ -0,0 +1,168 @@ +package com.taobao.arthas.core.util; + +import java.io.File; +import java.net.URISyntaxException; +import java.util.Iterator; +import java.util.Properties; + +import org.assertj.core.api.Assertions; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import com.alibaba.arthas.deps.ch.qos.logback.classic.Level; +import com.alibaba.arthas.deps.ch.qos.logback.classic.Logger; +import com.alibaba.arthas.deps.ch.qos.logback.classic.LoggerContext; +import com.alibaba.arthas.deps.ch.qos.logback.classic.spi.ILoggingEvent; +import com.alibaba.arthas.deps.ch.qos.logback.core.Appender; +import com.alibaba.arthas.deps.ch.qos.logback.core.rolling.RollingFileAppender; +import com.taobao.arthas.core.env.ArthasEnvironment; +import com.taobao.arthas.core.env.PropertiesPropertySource; + +/** + * + * @author hengyunabc + * + */ +public class LogUtilTest { + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + ArthasEnvironment arthasEnvironment; + String testResourcesDir; + + @Before + public void before() throws URISyntaxException { + ClassLoader classLoader = LogUtilTest.class.getClassLoader(); + String logbakXmlPath = classLoader.getResource("logback-test.xml").toURI().getPath(); + + testResourcesDir = new File(logbakXmlPath).getParent(); + + arthasEnvironment = new ArthasEnvironment(); + } + + @Test + public void testArthasHome() throws URISyntaxException { + Properties properties1 = new Properties(); + properties1.put("arthas.home", testResourcesDir); + arthasEnvironment.addLast(new PropertiesPropertySource("test1", properties1)); + + LoggerContext loggerContext = LogUtil.initLooger(arthasEnvironment); + + Logger logger = loggerContext.getLogger("root"); + Level level = logger.getLevel(); + + Assertions.assertThat(level).isEqualTo(Level.ERROR); + } + + @Test + public void testLogConfig() throws URISyntaxException { + Properties properties1 = new Properties(); + properties1.put("arthas.home", testResourcesDir); + properties1.put(LogUtil.LOGGING_CONFIG_PROPERTY, testResourcesDir + "/logback-test.xml"); + arthasEnvironment.addLast(new PropertiesPropertySource("test1", properties1)); + + LoggerContext loggerContext = LogUtil.initLooger(arthasEnvironment); + + Logger logger = loggerContext.getLogger("root"); + Level level = logger.getLevel(); + + Assertions.assertThat(level).isEqualTo(Level.WARN); + } + + @Test + public void test_DefaultLogFile() throws URISyntaxException { + Properties properties1 = new Properties(); + properties1.put("arthas.home", testResourcesDir); + + String logFile = new File(System.getProperty("user.home"), "logs/arthas/arthas.log").getAbsolutePath(); + + arthasEnvironment.addLast(new PropertiesPropertySource("test1", properties1)); + + LoggerContext loggerContext = LogUtil.initLooger(arthasEnvironment); + + Logger logger = loggerContext.getLogger("root"); + Level level = logger.getLevel(); + + Assertions.assertThat(level).isEqualTo(Level.ERROR); + + Iterator> appenders = logger.iteratorForAppenders(); + + boolean foundFileAppender = false; + while (appenders.hasNext()) { + Appender appender = appenders.next(); + if (appender instanceof RollingFileAppender) { + RollingFileAppender fileAppender = (RollingFileAppender) appender; + String file = fileAppender.getFile(); + Assertions.assertThat(file).isEqualTo(logFile); + foundFileAppender = true; + } + } + Assertions.assertThat(foundFileAppender).isEqualTo(true); + } + + @Test + public void test_ARTHAS_LOG_FILE() throws URISyntaxException { + Properties properties1 = new Properties(); + properties1.put("arthas.home", testResourcesDir); + + String logFile = new File(tempFolder.getRoot().getAbsoluteFile(), "test.log").getAbsolutePath(); + + properties1.put(LogUtil.FILE_NAME_PROPERTY, logFile); + arthasEnvironment.addLast(new PropertiesPropertySource("test1", properties1)); + + LoggerContext loggerContext = LogUtil.initLooger(arthasEnvironment); + + Logger logger = loggerContext.getLogger("root"); + Level level = logger.getLevel(); + + Assertions.assertThat(level).isEqualTo(Level.ERROR); + + Iterator> appenders = logger.iteratorForAppenders(); + + boolean foundFileAppender = false; + while (appenders.hasNext()) { + Appender appender = appenders.next(); + if (appender instanceof RollingFileAppender) { + RollingFileAppender fileAppender = (RollingFileAppender) appender; + String file = fileAppender.getFile(); + Assertions.assertThat(file).isEqualTo(logFile); + foundFileAppender = true; + } + } + Assertions.assertThat(foundFileAppender).isEqualTo(true); + } + + @Test + public void test_ARTHAS_LOG_PATH() throws URISyntaxException { + Properties properties1 = new Properties(); + properties1.put("arthas.home", testResourcesDir); + + String logFile = new File(tempFolder.getRoot().getAbsoluteFile(), "arthas.log").getAbsolutePath(); + + properties1.put(LogUtil.FILE_PATH_PROPERTY, tempFolder.getRoot().getAbsolutePath()); + arthasEnvironment.addLast(new PropertiesPropertySource("test1", properties1)); + + LoggerContext loggerContext = LogUtil.initLooger(arthasEnvironment); + + Logger logger = loggerContext.getLogger("root"); + Level level = logger.getLevel(); + + Assertions.assertThat(level).isEqualTo(Level.ERROR); + + Iterator> appenders = logger.iteratorForAppenders(); + + boolean foundFileAppender = false; + while (appenders.hasNext()) { + Appender appender = appenders.next(); + if (appender instanceof RollingFileAppender) { + RollingFileAppender fileAppender = (RollingFileAppender) appender; + String file = fileAppender.getFile(); + Assertions.assertThat(file).isEqualTo(logFile); + foundFileAppender = true; + } + } + Assertions.assertThat(foundFileAppender).isEqualTo(true); + } +} diff --git a/core/src/test/resources/logback-test.xml b/core/src/test/resources/logback-test.xml new file mode 100644 index 000000000..a36f03764 --- /dev/null +++ b/core/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + + + + \ No newline at end of file diff --git a/core/src/test/resources/logback.xml b/core/src/test/resources/logback.xml new file mode 100644 index 000000000..682355e8c --- /dev/null +++ b/core/src/test/resources/logback.xml @@ -0,0 +1,39 @@ + + + + + + + + ${ARTHAS_LOG_FILE} + + %date %level [%thread] %logger{10} [%file:%line] %msg%n + + + + ${ARTHAS_LOG_FILE}.%d{yyyy-MM-dd}.%i.log + + 7 + 1MB + 10MB + + + + + + ${CONSOLE_LOG_PATTERN} + utf8 + + + + + + + + + \ No newline at end of file diff --git a/packaging/src/main/assembly/assembly.xml b/packaging/src/main/assembly/assembly.xml index 7e4372b22..1f2810a83 100644 --- a/packaging/src/main/assembly/assembly.xml +++ b/packaging/src/main/assembly/assembly.xml @@ -17,6 +17,14 @@ ../core/target/arthas-core-shade.jar arthas-core.jar + + ../core/src/main/java/logback.xml + logback.xml + + + ../core/src/main/java/arthas.properties + arthas.properties + ../agent/target/arthas-agent-jar-with-dependencies.jar arthas-agent.jar