标签
Btrace,正则匹配类及方法,监控指定注解,异常捕获
对btrace应用参考:https://my.oschina.net/yaofull/blog/2966834
所有Controller方法日志及异常打印
package com.sun.btrace.bin;
import com.sun.btrace.AnyType;
import com.sun.btrace.annotations.*;
import java.util.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import static com.sun.btrace.BTraceUtils.*;
@BTrace(unsafe = true)
public class Test{
@TLS
static Throwable currentException;
//监控所有controller方法的输入输出
@OnMethod(clazz = "/com\\.cetc\\.hubble\\..*Controller/",method = "/.*/",location=@Location(Kind.RETURN))
public static void printMethodLog(@ProbeClassName String pcn, // 被拦截的类名
@ProbeMethodName String pmn, //被拦截的方法名
AnyType[] args, //被拦截的方法的参数值
@Return AnyType result ,@Duration long duration){
println("------------------ start ---------------");
println("className: " + pcn);
println("MethodName: " + pmn +" duration:"+ duration/1000000 + "ms");
println("args: " + JSON.toJSONString(args) );
println("result: " +JSON.toJSONString(result));
println("------------------ end ---------------");
println();
}
//监控异常
@OnMethod(
clazz="/com\\.cetc\\.hubble\\..*/",
method="/.*/",
location=@Location(Kind.ERROR)
)
public static void onerror(@TargetInstance Throwable exception) {
println("------------------ start ---------------");
// 打印异常堆栈
Threads.jstack(exception);
println("------------------ end ---------------");
println();
}
}
指定注解的日志及异常信息
注解类
package com.cetc.hubble.common.annotation;
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BTraceEntry {
boolean required() default true;
}
脚本
package com.sun.btrace.bin;
import com.sun.btrace.AnyType;
import com.sun.btrace.annotations.*;
import java.util.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import static com.sun.btrace.BTraceUtils.*;
@BTrace(unsafe = true)
public class Annotation{
@TLS
static Throwable currentException;
//监控某一个方法的输入输出
@OnMethod(clazz = "/com\\.cetc\\.hubble\\..*/",method = "@com.cetc.hubble.common.annotation.BTraceEntry",location=@Location(Kind.RETURN))
public static void printMethodLog(@ProbeClassName String pcn, // 被拦截的类名
@ProbeMethodName String pmn, //被拦截的方法名
AnyType[] args, //被拦截的方法的参数值
@Return AnyType result ,@Duration long duration){
println("------------------ start ---------------");
println("className: " + pcn);
println("MethodName: " + pmn +" duration:"+ duration/1000000 + "ms");
println("args: " + JSON.toJSONString(args) );
println("result: " +JSON.toJSONString(result));
println("------------------ end ---------------");
println();
}
//监控异常
@OnMethod(
clazz="/com\\.cetc\\.hubble\\..*/",
method="/.*/",
location=@Location(Kind.ERROR)
)
public static void onerror(@TargetInstance Throwable exception) {
println("------------------ start ---------------");
// 打印异常堆栈
Threads.jstack(exception);
println("------------------ end ---------------");
println();
}
}