threeperson
发布于 2021-11-03 / 0 阅读
0
0

springboot+logstash+logagent

近日对接神策服务,发现了一些问题。神策server端收集打点数据,提供了http实时同步和logagent两种同步方式,由于http方式同步存在丢数据和性能问题,所以考logagent方式。logagent方式需要在程序里将打点数据写入文件,再通过logagent将数据同步到他们的数据服务。由于我们的服务是微服务,容器随时都会销毁,数据就会丢失。当然也不能在宿主机上写数据,否则实例动态伸缩就很麻烦了。通过阅读神策的consumer源码,发现consumer职责很简单,就是将数据写入文件或者已http方式发送给数据服务。于是自定义一个consumer,将打点数据已日志的方式通过logstash落到日志服务器,再通过logagent将日志上报数据服务。

###自定义consumer

```

public class SensorsLoggingConsumer implements Consumer {

private static final Logger logger = LoggerUtils.getLogger(SensorsLoggingConsumer.class);

@Override

public void send(Map<String, Object> message) {

logger.info(JsonUtil.toJson(message));

}

@Override

public void flush() {

}

@Override

public void close() {

}

}

```

### 初始化

```

@Bean

public SensorsLoggingConsumer concurrentLoggingConsumer() {

return new SensorsLoggingConsumer();

}

@Bean

public SensorsAnalytics sensorsAnalytics(SensorsLoggingConsumer debugConsumer) {

return new SensorsAnalytics(debugConsumer);

}

```

由于神策打点日志和业务日志在一起,logagent数据同步时就会把所有日志做提交,就会出现很多无效提交。

于是通过logstash 将神策打点日志写入一个独立的目录下,再通过logagent同步到神策数据服务。

### logstash 提取打点日志到独立文件

```

if "SensorsLoggingConsumer" in [class] {

file {

path => "/home/data/logs/logstash/litetuo/sensors/log-%{+YYYY-MM-dd}.%{+HH}.log"

codec => line {format => "%{[rest]}"}

}

}

```

SensorsLoggingConsumer:神策打点日志类名

path:日志目录

codec: 提取指定日志内容

### logagent 重要配置

```

host=xxx.xxxx.com #服务地址

port:8888 #端口

logagent_id=debug_2021 #当日志重复传输会报错,可以通过更换id 修正

path=/home/data/logs #日志目录

pattern=*.log #文件模糊匹配

```


评论