近日对接神策服务,发现了一些问题。神策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 #文件模糊匹配
```