remove the logger.api dependency, use repackaged logger. #985

This commit is contained in:
hengyunabc
2020-03-31 23:28:10 +08:00
parent 5eb7ac4ded
commit 7332033332
51 changed files with 679 additions and 309 deletions
+3
View File
@@ -0,0 +1,3 @@
#arthas.config.overrideAll=true
#arthas.telnetPort=9998
#arthas.httpPort=9999
@@ -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";
@@ -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;
@@ -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<String> 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;
@@ -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();
@@ -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();
}
@@ -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);
}
}
@@ -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<Class<?>> classesToEnhance;
private Map<Class<?>, File> dumpResult;
@@ -33,7 +34,7 @@ class ClassDumpTransformer implements ClassFileTransformer {
public ClassDumpTransformer(Set<Class<?>> classesToEnhance, File directory) {
this.classesToEnhance = classesToEnhance;
this.dumpResult = new HashMap<Class<?>, File>();
this.arthasLogHome = new File(LogUtil.LOGS_ARTHAS_DIR);
this.arthasLogHome = new File(LogUtil.loggingDir());
this.directory = directory;
}
@@ -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);
}
}
@@ -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 {
@@ -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);
}
}
@@ -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;
@@ -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;
@@ -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());
}
}
@@ -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);
}
}
@@ -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();
@@ -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) {
@@ -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<String> 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");
@@ -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 {
@@ -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;
@@ -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();
}
@@ -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);
@@ -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<String> stackThreadLocal = new ThreadLocal<String>();
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();
}
}
@@ -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();
}
@@ -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();
@@ -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();
}
@@ -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<String, String> 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());
}
}
@@ -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<Future<Void>> {
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<Future<Void>> {
@Override
public void handle(Future<Void> 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);
}
}
@@ -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());
}
}
}
@@ -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;
@@ -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<CommandResolver> 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());
}
@@ -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<Integer, TimerTask> jobTimeoutTaskMap = new HashMap<Integer, TimerTask>();
private static final Logger logger = LogUtil.getArthasLogger();
private static final Logger logger = LoggerFactory.getLogger(GlobalJobControllerImpl.class);
@Override
public void close(final Handler<Void> completionHandler) {
@@ -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) {
@@ -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<CommandProcess> 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);
}
@@ -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<Completion> {
private static final Logger logger = LogUtil.getArthasLogger();
private static final Logger logger = LoggerFactory.getLogger(CompletionHandler.class);
private final Handler<com.taobao.arthas.core.shell.cli.Completion> completionHandler;
private final Session session;
@@ -35,7 +36,7 @@ class CompletionHandler implements Consumer<Completion> {
completionHandler.handle(comp);
} catch (Throwable t) {
// t.printStackTrace();
logger.error(null, "completion error", t);
logger.error("completion error", t);
}
}
}
@@ -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());
@@ -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<Term> termHandler;
private NettyWebsocketTtyBootstrap bootstrap;
@@ -50,7 +51,7 @@ public class HttpTermServer extends TermServer {
}).get(connectionTimeout, TimeUnit.MILLISECONDS);
listenHandler.handle(Future.<TermServer>succeededFuture());
} catch (Throwable t) {
logger.error(null, "Error listening to port " + port, t);
logger.error("Error listening to port " + port, t);
listenHandler.handle(Future.<TermServer>failedFuture(t));
}
return this;
@@ -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.<TermServer>succeededFuture());
} catch (Throwable t) {
logger.error(null, "Error listening to port " + port, t);
logger.error("Error listening to port " + port, t);
listenHandler.handle(Future.<TermServer>failedFuture(t));
}
return this;
@@ -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<FullHttpRequest> {
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<FullHttpRequ
}
} catch (Throwable e) {
logger.error("arthas", "arthas process http request error: " + request.uri(), e);
logger.error("arthas process http request error: " + request.uri(), e);
} finally {
ctx.write(response);
ChannelFuture future = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
@@ -2,14 +2,14 @@ package com.taobao.arthas.core.shell.term.impl.httptelnet;
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.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.Helper;
import com.taobao.arthas.core.shell.term.impl.TermImpl;
import com.taobao.arthas.core.util.LogUtil;
import com.taobao.middleware.logger.Logger;
import io.termd.core.function.Consumer;
import io.termd.core.tty.TtyConnection;
@@ -22,7 +22,7 @@ import io.termd.core.tty.TtyConnection;
*/
public class HttpTelnetTermServer extends TermServer {
private static Logger logger = LogUtil.getArthasLogger();
private static final Logger logger = LoggerFactory.getLogger(HttpTelnetTermServer.class);
private Handler<Term> termHandler;
private NettyHttpTelnetTtyBootstrap bootstrap;
@@ -55,7 +55,7 @@ public class HttpTelnetTermServer extends TermServer {
}).get(connectionTimeout, TimeUnit.MILLISECONDS);
listenHandler.handle(Future.<TermServer>succeededFuture());
} catch (Throwable t) {
logger.error(null, "Error listening to port " + port, t);
logger.error("Error listening to port " + port, t);
listenHandler.handle(Future.<TermServer>failedFuture(t));
}
return this;
@@ -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 {
@@ -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";
}
@@ -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
* <pre>
* 1. 尝试从 arthas.logging.config 这个配置里加载 logback.xml
* 2. 尝试从 arthas.home 下面找 logback.xml
*
* 可以用 arthas.logging.file.name 指定具体arthas.log的名字
* 可以用 arthas.logging.file.path 指定具体arthas.log的目录
*
* </pre>
*
* @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<Appender<ILoggingEvent>> appenders = loggerContext.getLogger("root").iteratorForAppenders();
while (appenders.hasNext()) {
Appender<ILoggingEvent> 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");
}
}
@@ -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 <E>
*/
public class ThreadUnsafeGaStack<E> implements GaStack<E> {
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<E> implements GaStack<E> {
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<E> implements GaStack<E> {
} 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());
}
}
}
}
+58
View File
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="ARTHAS_LOG_PATH" value="${ARTHAS_LOG_PATH:-${user.home}/logs/arthas}" />
<property name="ARTHAS_LOG_FILE" value="${ARTHAS_LOG_FILE:-${ARTHAS_LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/arthas.log}" />
<property name="RESULT_LOG_FILE" value="${RESULT_LOG_FILE:-${ARTHAS_LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/../arthas-cache/result.log}" />
<!-- arthas.log -->
<appender name="ARTHAS" class="com.alibaba.arthas.deps.ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ARTHAS_LOG_FILE}</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
</pattern>
</encoder>
<rollingPolicy class="com.alibaba.arthas.deps.ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${ARTHAS_LOG_FILE}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>7</maxHistory>
<maxFileSize>1MB</maxFileSize>
<totalSizeCap>10MB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- result.log -->
<appender name="RESULT" class="com.alibaba.arthas.deps.ch.qos.logback.core.rolling.RollingFileAppender">
<file>${RESULT_LOG_FILE}</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
</pattern>
</encoder>
<rollingPolicy class="com.alibaba.arthas.deps.ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${RESULT_LOG_FILE}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>7</maxHistory>
<maxFileSize>1MB</maxFileSize>
<totalSizeCap>10MB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- <appender name="CONSOLE" class="com.alibaba.arthas.deps.ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender> -->
<result level="INFO">
<!-- <appender-ref ref="CONSOLE" /> -->
<appender-ref ref="RESULT" />
</result>
<root level="INFO">
<!-- <appender-ref ref="CONSOLE" /> -->
<appender-ref ref="ARTHAS" />
</root>
</configuration>