更新时间:2025-06-24 GMT+08:00
分享

云日志服务Go SDK

云日志服务SDK提供了Go语言上报日志的一系列方法,方便用户直接使用编码方式上报日志到云日志服务后台。

传输协议

HTTPS

使用前提

使用说明

  • 当用户修改权限后,权限信息在一天后生效。
  • 通过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参数说明。
    表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方法类参数说明。

    单次上报条数小于4096条,且小于512K。

    表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。

相关文档