
# 云日志服务Go SDK
云日志服务SDK提供了Go语言上报日志的一系列方法，方便用户直接使用编码方式上报日志到云日志服务后台。
#### 传输协议
HTTPS
#### 使用前提
- 参考[注册华为账号并开通华为云](https://support.huaweicloud.com/usermanual-account/account_id_001.html)中操作，完成注册。

- 确认云日志服务的区域，请用户根据所在区域，选择RegionName。
- [获取华为账号的AK/SK](https://support.huaweicloud.com/iam_faq/iam_01_0618.html)。
- 获取华为云账号的项目ID（project id），详细步骤请参见[API凭证](https://support.huaweicloud.com/usermanual-ca/ca_01_0002.html)。
- 获取需要上报到LTS的[日志组ID]和[日志流ID]。
 
#### 使用说明
- 当用户修改权限后，权限信息在一天后生效。
- 通过Go SDK上报日志到LTS的时间相距当前时间不超过2天，否则上报日志会被LTS删除。
- 当前仅华北-北京四、华东-上海一、华南-广州区域使用Go SDK时支持跨云/本地上报日志，Endpoint端口使用443。
 
#### 注意事项
认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
#### 安装Go SDK
1. 获取LTS Go SDK包。 
   ```
   go get github.com/huaweicloud/huaweicloud-lts-sdk-go
   ```
   
   
2. 导入日志LTS Go SDK包。 
   ```
   import github.com/huaweicloud/huaweicloud-lts-sdk-go
   ```
   
   
3. 编写上报日志代码。 
   可以自定义发送成功与失败时的回调方法，实现方式请参考如下命令：自定义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参数说明。
  表1producer 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方法类参数说明。 单次上报条数小于4096条，且小于512K。
  表2GenerateLog方法类参数说明 
  | 参数名称     | 描述          | 类型                  | 是否需要填写 |
  |:---|:---|:---|:---|
  | contents | 批量日志内容。     | \[\]string          | 是      |
  | labels   | 日志标签，map格式。 | map\[string\]string | 是      |
     
  
- 日志上报SendLog方法类参数说明。
  表3SendLog方法类参数说明 
  |   参数名称   |  描述   |     类型     | 是否需要填写 |
  |---|---|---|---|
  | groupId  | 日志组id | long       | 是      |
  | streamId | 日志流id | String     | 是      |
  | log      | 日志结构  | struct log | 是      |
     
  
- 结构化日志上报StructLog方法类参数说明。
  表4StructLog方法类参数说明 
  |   参数名称   |   描述   |           类型            | 是否需要填写 |
  |---|---|---|---|
  | Time     | 日志上报时间 | int64                   | 否      |
  | Contents | 日志上报内容 | \[\]map\[string\]string | 是      |
     
  
- 结构化日志上报SendLogStruct方法类参数说明。
  表5SendLogStruct方法类参数说明 
  |   参数名称   |  描述   |        类型        | 是否需要填写 |
  |---|---|---|---|
  | 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：单击日志组名称对应的![](https://support.huaweicloud.com/usermanual-lts/zh-cn_image_0000001674902398.png)按钮，鼠标悬浮在日志流名称上，可查看日志流名称和日志流ID。
 
