SLS日志服务的集成配置是怎样的
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,SLS日志服务的集成配置是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。配置pom.xml依赖
千家信息网最后更新 2024年11月18日SLS日志服务的集成配置是怎样的
SLS日志服务的集成配置是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
配置
pom.xml依赖
com.aliyun.openservices log-loghub-producer 0.1.4 com.alibaba fastjson com.aliyun.openservices aliyun-log-producer 0.3.4 com.aliyun.openservices aliyun-log 0.6.33 com.google.protobuf protobuf-java 2.5.0 com.aliyun.openservices loghub-client-lib 0.6.16
配置AliLogConfig
package com.yhzy.doudoubookserver.global.alilog;import com.aliyun.openservices.log.Client;import com.aliyun.openservices.log.producer.LogProducer;import com.aliyun.openservices.log.producer.ProducerConfig;import com.aliyun.openservices.log.producer.ProjectConfig;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Scope;/** * @author zhangqinghe * @version 1.0.0 * @email her550@dingtalk.com * @date 2020/12/23 * @since 1.0.0 */@Configuration@Scope("singleton")public class AliLogConfig { public static String accessKeyId = ""; public static String accessKeySecret = ""; public static String endPoint = ""; public static String projectName = SLSEnvironment.BOOK_PROJECT; @Bean @ConditionalOnClass(LogProducer.class) public LogProducer getLogProducer() { LogProducer producer = new LogProducer(producerConfig()); producer.setProjectConfig(projectConfig()); return producer; } @Bean @ConditionalOnClass(ProducerConfig.class) public ProducerConfig producerConfig() { ProducerConfig producerConfig = new ProducerConfig(); //被缓存起来的日志的发送超时时间,如果缓存超时,则会被立即发送,单位是毫秒 producerConfig.packageTimeoutInMS = 1000; //每个缓存的日志包的大小的上限,不能超过5MB,单位是字节 producerConfig.logsBytesPerPackage = 5 * 1024 * 1024; //每个缓存的日志包中包含日志数量的最大值,不能超过4096 producerConfig.logsCountPerPackage = 4096; //单个producer实例可以使用的内存的上限,单位是字节 producerConfig.memPoolSizeInByte = 1000 * 1024 * 1024; //IO线程池最大线程数量,主要用于发送数据到日志服务 producerConfig.maxIOThreadSizeInPool = 50; //当使用指定shardhash的方式发送日志时,这个参数需要被设置,否则不需要关心。后端merge线程会将映射到同一个shard的数据merge在一起,而shard关联的是一个hash区间, //producer在处理时会将用户传入的hash映射成shard关联hash区间的最小值。每一个shard关联的hash区间,producer会定时从loghub拉取,该参数的含义是每隔shardHashUpdateIntervalInMS毫秒, producerConfig.shardHashUpdateIntervalInMS = 10 * 60 * 1000; producerConfig.retryTimes = 3; return producerConfig; } @Bean @ConditionalOnClass(ProjectConfig.class) public ProjectConfig projectConfig() { return new ProjectConfig(projectName, endPoint, accessKeyId, accessKeySecret); } /** * 读取sls对象 用于读取数据 * @return */ @Bean public Client client(){ String accessId = ""; String accessKey = ""; String host = ""; return new Client(host, accessId, accessKey); }}
配置AliLogUtil
package com.yhzy.doudoubookserver.common;import com.aliyun.openservices.log.common.LogItem;import com.aliyun.openservices.log.producer.LogProducer;import com.yhzy.doudoubookserver.global.alilog.AliLogConfig;import com.yhzy.doudoubookserver.global.alilog.CallbackLogInfo;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.util.Vector;/** * @author zhangqinghe * @version 1.0.0 * @email her550@dingtalk.com * @date 2020/12/23 * @since 1.0.0 */@Componentpublic class AliLogUtil { @Resource private AliLogConfig aliLogConfig; public void saveLog(String projectName,String logStore, VectorlogGroup, String topic, String source,Long millis) throws InterruptedException { final LogProducer logProducer = aliLogConfig.getLogProducer(); // 并发调用 send 发送日志 logProducer.send(projectName, logStore, topic, source, logGroup, new CallbackLogInfo(projectName, logStore, topic,null, source, logGroup, logProducer)); //主动刷新缓存起来的还没有被发送的日志 logProducer.flush(); //等待发送线程退出 Thread.sleep(millis); //关闭后台io线程,close会将调用时刻内存中缓存的数据发送出去 logProducer.close(); }}
配置CallbackLogInfo
package com.yhzy.doudoubookserver.global.alilog;import com.aliyun.openservices.log.common.LogItem;import com.aliyun.openservices.log.exception.LogException;import com.aliyun.openservices.log.producer.ILogCallback;import com.aliyun.openservices.log.producer.LogProducer;import com.aliyun.openservices.log.response.PutLogsResponse;import java.util.Vector;/** * @author zhangqinghe * @version 1.0.0 * @email her550@dingtalk.com * @date 2020/12/23 * @since 1.0.0 */public class CallbackLogInfo extends ILogCallback { // 保存要发送的数据,当时发生异常时,进行重试 public String project; public String logstore; public String topic; public String shardHash; public String source; public Vectoritems; public LogProducer producer; public int retryTimes = 0; public CallbackLogInfo(String project, String logstore, String topic, String shardHash, String source, Vector items, LogProducer producer) { super(); this.project = project; this.logstore = logstore; this.topic = topic; this.shardHash = shardHash; this.source = source; this.items = items; this.producer = producer; } public void onCompletion(PutLogsResponse response, LogException e) { if (e != null) { // 打印异常 System.out.println(e.GetErrorCode() + ", " + e.GetErrorMessage() + ", " + e.GetRequestId()); // 最多重试三次 if (retryTimes++ < 3) { producer.send(project, logstore, topic, source, shardHash, items, this); } } else { //请求id System.out.println("send success, request id: " + response.GetRequestId()); } }}
配置SLSEnvironment
记录sls日志相关 project & logStore 参数名配置
package com.yhzy.doudoubookserver.global.alilog;import java.time.LocalDateTime;import java.time.ZoneOffset;/** * sls日志相关 project & logStore 参数名配置 * * @author zhangqinghe * @version 1.0.0 * @email her550@dingtalk.com * @date 2020/12/25 * @since 1.0.0 */public interface SLSEnvironment { /** 测试project*/ String TEST_PROJECT = "test_project"; /** 测试logStore*/ String TEST_LOGSTORE = "test_logstore"; /** 开始时间*/ public static Integer FROM() { return Math.toIntExact(LocalDateTime.now().plusDays(-3).withHour(0).withMinute(0).withSecond(0).withNano(0).toInstant(ZoneOffset.of("+8")).toEpochMilli() / 1000); } /** 结束时间*/ public static Integer TO() { return Math.toIntExact(LocalDateTime.now().plusDays(1).withHour(23).withMinute(59).withSecond(59).withNano(0).toInstant(ZoneOffset.of("+8")).toEpochMilli() / 1000); } /** 最小开始时间 该时间为2020年12月1日的unix时间戳*/ public static Integer MINFROM(){ return 1606752000; } /** 最大结束时间 该时间为当前时间的unix时间戳*/ public static Integer MAXTO() { return Math.toIntExact((System.currentTimeMillis()+86400000) / 1000); }}
读取写入测试AliLogTest
读取es中的数据写入到sls中
package com.yhzy;/** * @author zhangqinghe * @version 1.0.0 * @email her550@dingtalk.com * @date 2020/12/24 * @since 1.0.0 */import com.aliyun.openservices.log.Client;import com.aliyun.openservices.log.common.*;import com.aliyun.openservices.log.exception.LogException;import com.aliyun.openservices.log.response.*;import com.yhzy.doudoubookserver.common.AliLogUtil;import com.yhzy.doudoubookserver.global.alilog.SLSEnvironment;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.index.query.RangeQueryBuilder;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;import java.io.IOException;import java.time.LocalDateTime;import java.time.ZoneOffset;import java.util.*;/** * @author zhangqinghe * @version 1.0.0 * @email her550@dingtalk.com * @date 2020/12/23 * @since 1.0.0 */@RunWith(SpringRunner.class)@SpringBootTest(classes = DoudouSLSApplication.class)public class AliLogTest { @Resource private AliLogUtil aliLogUtil; @Resource private RestHighLevelClient restHighLevelClient; /** * 读取分析测试 * @throws LogException */ @Test public void read() throws LogException { String accessId = ""; String accessKey = ""; String host = ""; String project = "zqhtest"; String logStore = "test_logstore"; Client client = new Client(host, accessId, accessKey); long time = new Date().getTime()/1000; /* * project : Project名称。 * logStore : LogStore名称。 * from : 查询开始时间点。Unix时间戳格式,表示从1970-1-1 00:00:00 UTC计算起的秒数。 * to : 查询结束时间点。Unix时间戳格式,表示从1970-1-1 00:00:00 UTC计算起的秒数。 * topic : 日志主题。 * query : 查询分析语句。 具体查看 https://help.aliyun.com/document_detail/53608.html?spm=a2c4g.11186623.2.17.56322e4acEkU4X#concept-nyf-cjq-zdb * line : 请求返回的最大日志条数。最小值为0,最大值为100,默认值为100。 没用明白呢...这个和query中的limit是两个东西???? * offset : 查询开始行。默认值为0。 * reverse : 是否按日志时间戳逆序返回日志,精确到分钟级别。默认值为false。 true:按照逆序返回日志。 false:按照顺序返回日志。 */ GetLogsResponse getLogsResponse = client.GetLogs( project, logStore, (int) (time - 36000000), (int) time, "", "* | select app_version,channel_id,content_id,COUNT(content_id) contentCount,COUNT(content_id) chapterCount, sum(time) timeSum GROUP BY app_version,channel_id,content_id LIMIT 100010", 25, 0, false); for (QueriedLog getLog : getLogsResponse.GetLogs()) { System.out.println(getLog.GetLogItem().ToJsonString()); } } /** * 采集数据测试 * 读取es中的数据,写入到sls中 * @throws IOException */ @Test public void test1() throws IOException { VectorlogItems = new Vector<>(); //读取es中的书籍阅读数据 SearchRequest request = new SearchRequest("bookanalysis"); long start = LocalDateTime.now().plusDays(-1).withHour(11).withMinute(0).withSecond(0).withNano(0).toInstant(ZoneOffset.of("+8")).toEpochMilli(); long end = LocalDateTime.now().plusDays(-1).withHour(12).withMinute(0).withSecond(0).withNano(0).toInstant(ZoneOffset.of("+8")).toEpochMilli(); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); List filter = boolQuery.filter(); //时间区间条件 filter.add(rangeQuery(start, end, "create_time")); //这里拼接动态条件 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //添加条件 searchSourceBuilder.query(boolQuery); request.source(searchSourceBuilder.trackTotalHits(true).size(15000)); SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT); for (SearchHit hit : response.getHits().getHits()) { Map map = hit.getSourceAsMap(); LogItem logItem = new LogItem(); logItem.PushBack("app_version",map.get("app_version")==null?"1":map.get("app_version").toString()); logItem.PushBack("book_id",map.get("book_id")==null?"1":map.get("book_id").toString()); logItem.PushBack("book_name",map.get("book_name")==null?"1":map.get("book_name").toString()); logItem.PushBack("category_id_1",map.get("category_id_1")==null?"1":map.get("category_id_1").toString()); logItem.PushBack("category_id_2",map.get("category_id_2")==null?"1":map.get("category_id_2").toString()); logItem.PushBack("channel_id",map.get("channel_id")==null?"1":map.get("channel_id").toString()); logItem.PushBack("chapter_name",map.get("chapter_name")==null?"1":map.get("chapter_name").toString()); logItem.PushBack("content_id",map.get("content_id")==null?"1":map.get("content_id").toString()); logItem.PushBack("create_time",map.get("create_time")==null?"1":map.get("create_time").toString()); logItem.PushBack("device_id",map.get("device_id")==null?"1":map.get("device_id").toString()); logItem.PushBack("is_new",map.get("is_new")==null?"1":map.get("is_new").toString()); logItem.PushBack("is_official",map.get("is_official")==null?"1":map.get("is_official").toString()); logItem.PushBack("is_vip",map.get("is_vip")==null?"1":map.get("is_vip").toString()); logItem.PushBack("log_type",map.get("log_type")==null?"1":map.get("log_type").toString()); logItem.PushBack("position",map.get("position")==null?"1":map.get("position").toString()); logItem.PushBack("sex",map.get("site")==null?"1":map.get("site").toString()); logItem.PushBack("time",map.get("time")==null?"1":map.get("time").toString()); logItem.PushBack("user_id",map.get("user_id")==null?"1":map.get("user_id").toString()); logItems.add(logItem); } try { aliLogUtil.saveLog(SLSEnvironment.BOOK_PROJECT,SLSEnvironment.BOOK_LOGSTORE,logItems,"read","source ip",1000L); } catch (InterruptedException e) { e.printStackTrace(); } } public static RangeQueryBuilder rangeQuery(Long startTime, Long endTime, String name){ RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(name); if (startTime != null) { rangeQueryBuilder.gte(startTime); } if (endTime != null) { rangeQueryBuilder.lte(endTime); } return rangeQueryBuilder; }}
看完上述内容,你们掌握SLS日志服务的集成配置是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
日志
时间
配置
数据
缓存
最大
线程
测试
区间
参数
查询
服务
最小
单位
条件
关联
上限
内存
内容
名称
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
如何在域服务器上下发时间同步
邹平瓷砖软件开发定制
视图也存储数据库
139服务器设置
网络安全单位领导事迹
泰域网络技术有限公司
盐城智能化联想服务器服务商
无锡安卓软件开发招聘
网络安全行为漫画
躲猫猫pe服务器
不信谣不传谣不造谣网络安全
网络安全培训零学费
忘仙服务器
赵新秋 工业控制网络技术
数据库主要的技术指标有哪些
网络安全与执法专科就业
绝地求生手游有哪些服务器
浙江加工刀片服务器设计
数据库脚本编写
优人脉软件开发
备份服务器操作系统
西安大学网络安全研究生
cn根域名服务器
软件开发人才怎么找
每次开机都显示服务器管理器
OBC软件开发工程师简历
江苏标准软件开发厂家
上海互联网ipfs服务器
无线网络安全审计报告
数据库应用技术技能大赛