import{_ as e,o as p,c as i,a as s,b as c,w as o,d as a,e as n,r as l}from"./app.391b0e4e.js";const u={},d=a(`
\u63D0\u793A
Arthas \u652F\u6301 groovy \u811A\u672C\u589E\u5F3A\uFF0C\u5141\u8BB8\u50CF BTrace \u4E00\u6837\u7F16\u5199\u811A\u672C\u6765\u89E3\u51B3\u95EE\u9898\uFF0C\u53EF\u4EE5\u5728 groovy \u811A\u672C\u4E2D\u8FDB\u884C if/for/switch/while \u7B49\u63A7\u5236\u8BED\u53E5\uFF0C\u4E0D\u53D7\u9650\u5236\uFF0C\u4F46\u76F8\u6BD4 BTrace \u800C\u8A00\u62E5\u6709\u66F4\u591A\u7684\u9650\u5236\u8303\u56F4\u3002
\u53C2\u6570\u540D\u79F0 | \u53C2\u6570\u8BF4\u660E |
---|---|
class-pattern | \u7C7B\u540D\u8868\u8FBE\u5F0F\u5339\u914D |
method-pattern | \u65B9\u6CD5\u540D\u8868\u8FBE\u5F0F\u5339\u914D |
script-filepath | groovy \u811A\u672C\u7684\u7EDD\u5BF9\u8DEF\u5F84 |
[S] | \u5339\u914D\u6240\u6709\u7684\u5B50\u7C7B |
[E] | \u5F00\u542F\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\uFF0C\u9ED8\u8BA4\u4E3A\u901A\u914D\u7B26\u5339\u914D |
\u9700\u8981\u8BF4\u660E\u7684\u662F\uFF0C\u7B2C\u4E09\u4E2A\u8F93\u5165\u53C2\u6570\u662F\u811A\u672C\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u6BD4\u5982 /tmp/test.groovy
\uFF0C\u4E0D\u5EFA\u8BAE\u8F93\u5165\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u6BD4\u5982 ./test.groovy
/**
* \u589E\u5F3A\u811A\u672C\u76D1\u542C\u5668
*/
interface ScriptListener {
/**
* \u811A\u672C\u521B\u5EFA
*
* @param output \u8F93\u51FA\u5668
*/
void create(Output output);
/**
* \u811A\u672C\u9500\u6BC1
*
* @param output \u8F93\u51FA\u5668
*/
void destroy(Output output);
/**
* \u65B9\u6CD5\u6267\u884C\u524D
*
* @param output \u8F93\u51FA\u5668
* @param advice \u901A\u77E5\u70B9
*/
void before(Output output, Advice advice);
/**
* \u65B9\u6CD5\u6B63\u5E38\u8FD4\u56DE
*
* @param output \u8F93\u51FA\u5668
* @param advice \u901A\u77E5\u70B9
*/
void afterReturning(Output output, Advice advice);
/**
* \u65B9\u6CD5\u5F02\u5E38\u8FD4\u56DE
*
* @param output \u8F93\u51FA\u5668
* @param advice \u901A\u77E5\u70B9
*/
void afterThrowing(Output output, Advice advice);
}
Advice
\u8BF4\u660EOutput
\u8BF4\u660EOutput
\u53C2\u6570\u53EA\u62E5\u6709\u4E09\u4E2A\u65B9\u6CD5\uFF0C\u4E3B\u8981\u7684\u5DE5\u4F5C\u8FD8\u662F\u8F93\u51FA\u5BF9\u5E94\u7684\u6587\u672C\u4FE1\u606F
/**
* \u8F93\u51FA\u5668
*/
interface Output {
/**
* \u8F93\u51FA\u5B57\u7B26\u4E32(\u4E0D\u6362\u884C)
*
* @param string \u5F85\u8F93\u51FA\u5B57\u7B26\u4E32
* @return this
*/
Output print(String string);
/**
* \u8F93\u51FA\u5B57\u7B26\u4E32(\u6362\u884C)
*
* @param string \u5F85\u8F93\u51FA\u5B57\u7B26\u4E32
* @return this
*/
Output println(String string);
/**
* \u7ED3\u675F\u5F53\u524D\u811A\u672C
*
* @return this
*/
Output finish();
}
import com.taobao.arthas.core.command.ScriptSupportCommand
import com.taobao.arthas.core.util.Advice
import static java.lang.String.format
/**
* \u8F93\u51FA\u65B9\u6CD5\u65E5\u5FD7
*/
public class Logger implements ScriptSupportCommand.ScriptListener {
@Override
void create(ScriptSupportCommand.Output output) {
output.println("script create.");
}
@Override
void destroy(ScriptSupportCommand.Output output) {
output.println("script destroy.");
}
@Override
void before(ScriptSupportCommand.Output output, Advice advice) {
output.println(format("before:class=%s;method=%s;paramslen=%d;%s;",
advice.getClazz().getSimpleName(),
advice.getMethod().getName(),
advice.getParams().length, advice.getParams()))
}
@Override
void afterReturning(ScriptSupportCommand.Output output, Advice advice) {
output.println(format("returning:class=%s;method=%s;",
advice.getClazz().getSimpleName(),
advice.getMethod().getName()))
}
@Override
void afterThrowing(ScriptSupportCommand.Output output, Advice advice) {
output.println(format("throwing:class=%s;method=%s;",
advice.getClazz().getSimpleName(),
advice.getMethod().getName()))
}
}
\u4F7F\u7528\u793A\u4F8B\uFF1A
$ groovy com.alibaba.sample.petstore.dal.dao.ProductDao getProductById /Users/zhuyong/middleware/arthas/scripts/Logger.groovy -S
script create.
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 102 ms.
before:class=IbatisProductDao;method=getProductById;paramslen=1;[Ljava.lang.Object;@45df64fc;
returning:class=IbatisProductDao;method=getProductById;
before:class=IbatisProductDao;method=getProductById;paramslen=1;[Ljava.lang.Object;@5b0e2d00;
returning:class=IbatisProductDao;method=getProductById;