共計 5706 個字符,預計需要花費 15 分鐘才能閱讀完成。
SLS 日志服務的集成配置是怎樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
配置 pom.xml 依賴
!-- 服務器 --
dependency
groupId com.aliyun.openservices /groupId
artifactId log-loghub-producer /artifactId
version 0.1.4 /version
exclusions
exclusion
groupId com.alibaba /groupId
artifactId fastjson /artifactId
/exclusion
/exclusions
/dependency
dependency
groupId com.aliyun.openservices /groupId
artifactId aliyun-log-producer /artifactId
version 0.3.4 /version
/dependency
dependency
groupId com.aliyun.openservices /groupId
artifactId aliyun-log /artifactId
version 0.6.33 /version
/dependency
dependency
groupId com.google.protobuf /groupId
artifactId protobuf-java /artifactId
version 2.5.0 /version
/dependency
dependency
groupId com.aliyun.openservices /groupId
artifactId loghub-client-lib /artifactId
version 0.6.16 /version
/dependency
配置 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
*/
@Component
public class AliLogUtil {
@Resource
private AliLogConfig aliLogConfig;
public void saveLog(String projectName,String logStore, Vector LogItem 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 LogItem items;
public LogProducer producer;
public int retryTimes = 0;
public CallbackLogInfo(String project, String logstore, String topic, String shardHash, String source,
Vector LogItem 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;
正文完
發表至: 計算機運維
2023-08-25