Java Agent usage - acupple/dashcam GitHub Wiki
LogAgent 使用说明:
<dependency>
<groupId>org.mokey.acupple</groupId>
<artifactId>dashcam-agent</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
#必要,应用唯一标识,不可随意乱写。
dashcam.common.appId=9096123
#Kafka broker地址
dashcam.common.config.kafka-brokers=localhost:9092
dashcam.common.config.level=INFO
dashcam.common.config.enable=true
dashcam.common.config.trace-enable=true
#单位KB,每条日志的大小限制
dashcam.common.config.max-message-size=32
#日志打包发送的默认大小
dashcam.common.config.chunk-size = 50
- 普通日志: 类似传统日志(如log4j)的记录方式,不同的是,除message以外还可以记录title、tag等附加信息,并可以在DashcamUI中按照这些信息检索
public static void main(String[] args){
//实例化一个logger
ILog logger = LogManager.getLogger(LocalLogTest.class);
//仅记录message
logger.info("test message");
//记录title和message
logger.debug("debug", "not record");
try{
int i = 10/0;
}catch (Exception e){
logger.error(e);
}
//附带多个tag信息,方便检索和后期数据分析(直接传Map的方式)
Map<String, String> tags = new HashMap<String, String>();
tags.put("app1", "master");
tags.put("app2", "host");
logger.info("title","This is a log with tag for test", tags);
//使用TagBuilder辅助类,以流式编程的方式创建Tags
logger.info("title", "this is a test message",
TagBuilder.create().append("tag1", "value1")
//key-value的形式,其中value支持object类型,不强制用String
.append("tag2", 100)
//可以按照key=value,key=value的形式,一次append多个tag
.append("tag4=value4,tag5=value5")
.build());
System.exit(0);
}
- Trace日志: 用于程序的调用关系追踪。每个需要追踪的段落定义为一个Span,通过在代码段、方法或服务的起始、结束位置,设置Span的start、stop,即可搜集到这个Span的相关信息。Span之间可以嵌套,从而生成一个调用树。
//创建一个trace实例
private static ITrace trace = TraceManager.getTracer(TraceTest.class);
@Test
public void test(){
//创建一个span实例,并开始这个span
ISpan span = trace.startSpan("spanName", "traceTest", SpanType.WEB_SERVICE);
//写trace日志
trace.log(LogType.APP, LogLevel.INFO, "this is traceTest message");
try{
Thread.sleep(1000);
//模拟方法调用
service1();
}catch (Exception e){
trace.log(LogType.APP, LogLevel.ERROR, "trace test exception", e);
}finally {
//关闭span
span.stop();
//清理trace树中所有未主动stop的span,保证trace信息完整
//一般在整个trace过程中最末尾处调用一次即可
trace.clear();
}
}
private void service1(){
ISpan span = trace.startSpan("service1_span", "service1",SpanType.WEB_SERVICE);
try{
trace.log(LogType.APP, LogLevel.INFO, "service1 message");
service2(); //模拟方法调用
Thread.sleep(1000);
}catch (Exception e){
trace.log(LogType.APP, LogLevel.ERROR, "service1 failed", e);
}
finally {
span.stop();
}
}
private void service2(){
final ISpan span = trace.startSpan("service2_span", "service2", SpanType.WEB_SERVICE);
try{
trace.log(LogType.APP, LogLevel.INFO, "service2 message");
Thread thread = new Thread(){
@Override
public void run() {
//模拟远程方法调用,需要传递traceId和spanId给远程方法
service3(span.getTraceId(), span.getSpanId());
}
};
thread.start();
thread.join();
Thread.sleep(1000);
}catch (Exception e){
trace.log(LogType.APP, LogLevel.ERROR, "service2 failed", e);
}finally {
span.stop();
}
}
//远程调用,一般用于trace追踪一个远程服务,需要传递traceId和父Span的Id
private void service3(long traceId, long parentId){
ITrace trace = TraceManager.getTracer("rmoteTrace");
ISpan span = trace.continueSpan("remote_span", "rmote_service",
traceId, parentId, SpanType.WEB_SERVICE);
//注意这里是continue,不是start
trace.log(LogType.APP, LogLevel.INFO, "remote service message");
Map<String, String> tags = new HashMap<>();
tags.put("tag1", "value1");
try {
Thread.sleep(1000);
}catch (Exception e){}
trace.log(LogType.APP, LogLevel.INFO, "remote service message",tags );
span.stop();
trace.clear();
}