You need to enable JavaScript to run this app.
导航

通过 Go SDK 写入日志

最近更新时间2023.11.23 21:39:11

首次发布时间2023.11.23 21:39:11

Go Producer 用于海量数据场景下快速发送日志数据。本文档通过示例代码演示如何通过 Go Producer 采集日志数据。

前提条件

  • 已安装日志服务 Go SDK。更多信息,请参见安装 Go SDK

  • 已执行以下命令安装 proto 依赖包。

    go get -u github.com/gogo/protobuf/proto
    
  • 已添加 VOLCENGINE_ACCESS_KEY_ID 等环境变量。环境变量的配置方式请参考配置身份认证信息

    注意

    推荐通过环境变量动态获取火山引擎密钥等身份认证信息,以免 AccessKey 硬编码引发数据安全风险。

写入日志

场景说明

本文档通过示例代码演示如何通过 SDK 写入日志数据到日志服务。Go SDK 支持通过以下方式写入日志:

写入方式

说明

PutLogs

不推荐。
日志服务支持通过 PutLogs 接口同步请求的方式上传日志。如果选择使用 PutLogs 上传日志,建议您一次性聚合多条日志后调用一次 PutLogs 接口。相对于逐条上传日志的方式,日志聚合后上传可以提升吞吐率并避免触发限流。

Producer

推荐。
在实际生产环境中,为了提高数据写入效率,建议通过 Go Producer 方式写入日志数据。Producer 用于在海量数据、高并发场景下快速发送日志数据,具有异步发送、高性能、失败重试、优雅关闭等特性。

示例代码

通过 Go Producer 采集日志数据的示例代码如下。如需通过 PutLogs 接口写入日志数据,可参考快速开始

package tls

import (
    "fmt"
    "os"
    "time"

    "github.com/volcengine/volc-sdk-golang/service/tls"
    "github.com/volcengine/volc-sdk-golang/service/tls/pb"
    "github.com/volcengine/volc-sdk-golang/service/tls/producer"
)

func main() {
    // 初始化客户端,推荐通过环境变量动态获取火山引擎密钥等身份认证信息,以免 AccessKey 硬编码引发数据安全风险。详细说明请参考https://www.volcengine.com/docs/6470/1166455
    // 使用 STS 时,ak 和 sk 均使用临时密钥,且设置 VOLCENGINE_TOKEN;不使用 STS 时,VOLCENGINE_TOKEN 部分传空
    tlsProducerCfg := producer.GetDefaultProducerConfig()
    tlsProducerCfg.Endpoint = os.Getenv("VOLCENGINE_ENDPOINT")
    tlsProducerCfg.Region = os.Getenv("VOLCENGINE_REGION")
    tlsProducerCfg.AccessKeyID = os.Getenv("VOLCENGINE_ACCESS_KEY_ID")
    tlsProducerCfg.AccessKeySecret = os.Getenv("VOLCENGINE_ACCESS_KEY_SECRET")

    // 初始化并启动Producer
    tlsProducer := producer.NewProducer(tlsProducerCfg)
    tlsProducer.Start()

    // 请根据您的需要,填写topicId、source、filename
    topicID := "your-topic-id"
    source := "your-log-source"
    filename := "your-log-filename"

    // 调用Producer SendLog接口,一次提交一条日志
    // 您可根据实际需要,自行定义实现用于业务处理的CallBack,传入SendLog接口
    err := tlsProducer.SendLog("", topicID, source, filename, &pb.Log{
       Contents: []*pb.LogContent{
          {
             Key:   "key1",
             Value: "value1",
          },
          {
             Key:   "key2",
             Value: "value2",
          },
       },
       Time: time.Now().Unix(),
    }, nil)
    if err != nil {
       // 处理错误
       fmt.Println(err.Error())
    }

    // 调用Producer SendLogs接口,一次提交多条日志
    // 您可根据实际需要,自行定义实现用于业务处理的CallBack,传入SendLogs接口
    err = tlsProducer.SendLogs("", topicID, source, filename, &pb.LogGroup{
       Source:   source,
       FileName: filename,
       Logs: []*pb.Log{
          {
             Contents: []*pb.LogContent{
                {
                   Key:   "key1",
                   Value: "value1-1",
                },
                {
                   Key:   "key2",
                   Value: "value2-1",
                },
             },
             Time: time.Now().Unix(),
          },
          {
             Contents: []*pb.LogContent{
                {
                   Key:   "key1",
                   Value: "value1-2",
                },
                {
                   Key:   "key2",
                   Value: "value2-2",
                },
             },
             Time: time.Now().Unix(),
          },
       },
    }, nil)
    if err != nil {
       // 处理错误
       fmt.Println(err.Error())
    }

    // 关闭Producer
    tlsProducer.Close()
}

相关文档

  • 通过 SDK 发送调用 API 的请求以后,您会收到服务端的响应,如果响应中包含 200 以外的状态码,表示接口调用失败。您可以参考各个 API 的文档查看对应的错误码信息。
  • 关于 Go Producer 的详细信息,请参考 Go Producer
  • 关于 Go Producer 上传日志的完整示例代码,请参考 TLS Go SDK Demo on GitHub