云日志服务Go SDK
云日志服务SDK提供了Go语言上报日志的一系列方法,方便用户直接使用编码方式上报日志到云日志服务后台。
传输协议
HTTPS
使用前提
- 参考注册华为账号并开通华为云中操作,完成注册。
- 确认云日志服务的区域,请用户根据所在区域,选择RegionName。
- 获取华为账号的AK/SK。
- 获取华为云账号的项目ID(project id),详细步骤请参见API凭证。
- 获取需要上报到LTS的日志组ID和日志流ID。
使用说明
- 当用户修改权限后,权限信息在一天后生效。
- 通过Go SDK上报日志到LTS的时间相距当前时间不超过2天,否则上报日志会被LTS删除。
- 当前仅华北-北京四、华东-上海一、华南-广州区域使用Go SDK时支持跨云/本地上报日志,Endpoint端口使用443。
注意事项
认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。
安装Go SDK
- 获取LTS Go SDK包。
go get github.com/huaweicloud/huaweicloud-lts-sdk-go
- 导入日志LTS Go SDK包。
import github.com/huaweicloud/huaweicloud-lts-sdk-go
- 编写上报日志代码。
可以自定义发送成功与失败时的回调方法,实现方式请参考如下命令:自定义ErrorHandler的结构体,实现Success和Fail方法,并且在发送日志时直接使用。
SendLogWithCallBack(groupId, streamId string, log *Log, callback CallBack)
示例代码:
package main import ( "github.com/huaweicloud/huaweicloud-lts-sdk-go" "fmt" "sync" "time" ) var ( ak = "" sk = "" pid = "" groupId = "" streamId1 = "" streamId2 = "" region = "" endpoint = "" ) func main() { // 获取默认配置 producerConfig := producer.GetConfig() // 上报地址 producerConfig.Endpoint = endpoint // accessKeyId:华为云账号的AK, 认证用的AK硬编码到代码中或者明文存储都有很大的安全风险, 建议在配置文件或者环境变量中密文存放, 使用时解密, 确保安全 producerConfig.AccessKeyID = os.Getenv("accessKeyId") // accessKeySecret:华为云账号的SK, 认证用的SK硬编码到代码中或者明文存储都有很大的安全风险, 建议在配置文件或者环境变量中密文存放, 使用时解密, 确保安全 producerConfig.AccessKeySecret = os.Getenv("accessKeySecret") // 区域名称 producerConfig.RegionId = region // 账户projectid producerConfig.ProjectId = pid // 初始化producer实例 producerInstance := producer.InitProducer(producerConfig) // 启动producer producerInstance.Start() wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func() { for j := 0; j < 1000; j++ { labels := make(map[string]string) labels["keyA"] = "valueA" labels["keyB"] = "valueB" labels["keyC"] = "valueC" logContent := fmt.Sprintf("content for this test %d", j) // 生成日志 填入日志内容及labels log := producer.GenerateLog([]string{logContent}, labels) // 发送日志到日志组,日志流 err := producerInstance.SendLog(groupId, streamId1, log) err = producerInstance.SendLog(groupId, streamId2, log) if err != nil { fmt.Println(err) } handle := ErrorHandle{} // 带CallBack的发送日志方法,发送失败时会调用ErrorHandler的Fail方法 err = producerInstance.SendLogWithCallBack("groupId", "streamId1", log, handle) err = producerInstance.SendLogWithCallBack("groupId", "streamId1", log, handle) if err != nil { fmt.Println(err) } // 结构化日志上报方法 var sLog producer.StructLog logContent := make(map[string]string) logContent["keyA"] = "valueA" logContent["keyB"] = "valueB" logContent1 := make(map[string]string) logContent1["keyA1"] = "valueA1" logContent1["keyB1"] = "valueB1" sLog.Contents = append(sLog.Contents, logContent) sLog.Contents = append(sLog.Contents, logContent1) sLog.Time = time.Now().UnixNano() / 1000 /1000 // 发送结构化日志方法 err = producerInstance.SendLogStruct("groupId2", "streamId2", &sLog) if nil != err { continue } // 带CallBack的发送结构化日志方法,发送失败时会调用ErrorHandler的Fail方法 var callback ErrorHandle err = producerInstance.SendLogStructWithCallBack("groupId2", "streamId2", &sLog, callback) if nil != err { continue } time.Sleep(1 * time.Microsecond) } wg.Done() fmt.Printf("test func finished\n") }() } wg.Wait() fmt.Printf("send all complete ...") // 关闭发送实例 producerInstance.Close(60 * 1000) time.Sleep(10 * 60 * time.Second) } // errorHandle,可以针对发送成功和失败进行相关的callback调用,方便失败时打印错误日志,进行问题定位 type ErrorHandle struct{} // 发送成功时的callback方法 func (ErrorHandle) Success(result *producer.Result) { fmt.Printf("send log to lts success, success flag: %v\n", result.IsSuccessful()) } // 发送失败时的callback方法,可以打印result中的错误信息,方便问题定位 func (ErrorHandle) Fail(result *producer.Result) { fmt.Printf("send log to lts error, success flag: %v requestId: %s, httpcode: %d, errorCode: %s, errorMsg: %s\n", result.IsSuccessful(), result.GetRequestId(), result.GetHttpCode(), result.GetErrorCode(), result.GetErrorMessage()) }
配置参数说明
- producer config参数说明。
表1 producer config参数说明 参数名称
描述
类型
是否需要填写
默认值
ProjectId
华为云账号的项目ID(project id)。
String
必填
-
AccessKeyId
华为云账号的AK。
String
必填
-
AccessKeySecret
华为云账号的SK。
String
必填
-
RegionName
云日志服务的区域。
String
必填
-
Endpoint
上报的服务器域名或IP。
String
必填
-
TotalSizeInBytes
单个producer实例能缓存的日志大小上限。
int
选填
104857600(即100MB)
MaxBlockSec
如果producer可用空间不足,调用者在send方法上的最大阻塞时间,默认为60秒。建议为0秒。
- 当maxBlockMs值>=0时,则阻塞到设置的时间,如果到达阻塞时间,还是不能获取到内存,即报错且丢弃日志。
- 当maxBlockMs值=-1时,则一直阻塞到发送成功,且不会丢弃日志。
long
选填
60s
MaxIoWorkers
执行日志发送任务的任务池大小。
int
选填
默认10个
MaxBatchSize
当一个ProducerBatch中缓存的日志大小大于等于 batchSizeThresholdInBytes 时,该batch将被发送。
int
选填
524288(即0.5MB)
MaxBatchCount
当一个ProducerBatch中缓存的日志条数大于等于 batchCountThreshold 时,该batch将被发送。
int
选填
4096
LingerMs
一个 ProducerBatch 从创建到可发送的逗留时间。
int
选填
2s
Retries
如果某个ProducerBatch首次发送失败,能够对其重试的次数,建议为3次。如果retries小于等于0,该 ProducerBatch首次发送失败后将直接进入失败队列。
int
选填
10
BaseRetryBackoffMs
首次重试的退避时间。
long
选填
0.1s
MaxRetryBackoffMs
重试的最大退避时间。
long
选填
50s
- 日志生成GenerateLog方法类参数说明。
表2 GenerateLog方法类参数说明 参数名称
描述
类型
是否需要填写
contents
批量日志内容。
[]string
是
labels
日志标签,map格式。
map[string]string
是
- 日志上报SendLog方法类参数说明。
表3 SendLog方法类参数说明 参数名称
描述
类型
是否需要填写
groupId
日志组id
long
是
streamId
日志流id
String
是
log
日志结构
struct log
是
- 结构化日志上报StructLog方法类参数说明。
表4 StructLog方法类参数说明 参数名称
描述
类型
是否需要填写
Time
日志上报时间
int64
否
Contents
日志上报内容
[]map[string]string
是
- 结构化日志上报SendLogStruct方法类参数说明。
表5 SendLogStruct方法类参数说明 参数名称
描述
类型
是否需要填写
groupId
日志组id
String
是
streamId
日志流id
String
是
log
日志结构
Struct Logstruct
是
参数获取方式
- 上线区域表,使用华为云主机时参考以下信息:
表6 区域表 区域名称
区域
终端节点
华北-北京四
cn-north-4
https://lts-access.cn-north-4.myhuaweicloud.com:8102
华东-上海一
cn-east-3
https://lts-access.cn-east-3.myhuaweicloud.com:8102
华南-广州
cn-south-1
https://lts-access.cn-south-1.myhuaweicloud.com:8102
亚太-新加坡
ap-southeast-3
https://lts-access.ap-southeast-3.myhuaweicloud.com:8102
当前仅华北-北京四、华东-上海一、华南-广州区域使用SDK时支持跨云/本地上报日志,Endpoint端口使用443。
- 日志组ID:在云日志服务控制台,选择“日志管理”,鼠标悬浮在日志组名称上,可查看日志组名称和日志组ID。
- 日志流ID:单击日志组名称对应的
按钮,鼠标悬浮在日志流名称上,可查看日志流名称和日志流ID。