千家信息网

SLS日志服务的集成配置是怎样的

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,SLS日志服务的集成配置是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。配置pom.xml依赖
千家信息网最后更新 2026年11月04日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, Vector logGroup, 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 Vector items;    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 {        Vector logItems = 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安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 广州大一互联网络科技有限公司 港股互联网科技股 嘟嘟瓜互联网科技 互联网科技排名 互联网科技的英文 电子科技大学互联网 深圳期待互联网科技 互联网金融监管科技 海南购全球互联网科技 中国互联网有什么科技含量 北京华百购互联网科技有限公司 荆州市昕露互联网络科技有限公司 米聚互联网科技南京有限公司排面 互联网科技如何创业 产业互联网科技服务公司 广州互联网高科技取餐柜 福仕德教育科技互联网 河南商务圈互联网科技有限公司 六子台科技互联网展会 深圳恒合互联网络科技有限公司 互联网科技开发公司 卓越科技(互联网 ) 成都互联网科技公司 赫美联合互联网科技 互联网科技股午盘股票涨跌 青岛中康互联网医疗科技有限公司 重庆互联网医院沙龙医盟信息科技 花神(南京)互联网科技有限公司 亚光科技低轨卫星互联网
0