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

快速开始

最近更新时间2023.11.14 20:08:14

首次发布时间2023.07.25 15:10:13

本文介绍如何快速使用日志服务 C++ SDK 实现基础的日志采集流程,包括创建日志项目、创建日志主题、写入日志等操作。

前提条件

在使用 C++ SDK 前,请确保您已完成以下事项:

  • 已安装日志服务 C++ SDK。详细步骤请参考安装C++ SDK
  • 已创建并获取火山引擎 API 访问密钥。访问密钥 AccessKey 拥有所有 API 的全部权限。建议您通过 IAM 用户进行 API 相关操作和日常运维。使用 IAM 用户前,主账号需要为 IAM 用户授予日志服务相关资源和操作的权限。
  • 已添加 VOLCENGINE_ACCESS_KEY_ID 等环境变量。环境变量的配置方式请参考配置身份认证信息

创建相关资源

  1. 初始化 Client 实例。
    您可以参考以下示例代码,引入 TLS C++ SDK 并创建 TLS Client,初始化时推荐通过环境变量动态获取火山引擎密钥等身份认证信息,以免 AccessKey 硬编码引发数据安全风险。

    include <cstdlib>
    #include <ve-tls-cpp-sdk/TlsClient.h>
    #include <ve-tls-cpp-sdk/TlsClientConfig.h>
    #include <ve-tls-cpp-sdk/TlsRequest.h>
    #include <ve-tls-cpp-sdk/TlsJsonConversion.h>
    #include <ve-tls-cpp-sdk/TlsResponse.h>
    
    int main(int argc, char **argv) {
        // 创建client。
        TlsClientConfig cfg; {
            // 协议类型,推荐设置为 https://。
            cfg.scheme = "https://";
            // 初始化客户端,推荐通过环境变量动态获取火山引擎密钥等身份认证信息,以免 AccessKey 硬编码引发数据安全风险。详细说明请参考https://www.volcengine.com/docs/6470/1166455
            if (std::getenv("VOLCENGINE_ENDPOINT") != nullptr) {
                cfg.endpoint = std::getenv("VOLCENGINE_ENDPOINT");
            }
            if (std::getenv("VOLCENGINE_ACCESS_KEY_ID") != nullptr) {
                cfg.access_key_id = std::getenv("VOLCENGINE_ACCESS_KEY_ID");
            }
            if (std::getenv("VOLCENGINE_ACCESS_KEY_SECRET") != nullptr) {
                cfg.access_key_secret = std::getenv("VOLCENGINE_ACCESS_KEY_SECRET");
            }
            if (std::getenv("VOLCENGINE_REGION") != nullptr) {
                cfg.region = std::getenv("VOLCENGINE_REGION");
            }
        }
        TlsClient cli = TlsClient(cfg);
    }
    
  2. 创建日志项目。
    您可以通过 TLS Client 进行日志项目的管理,例如创建和删除日志项目。对应的参数设置请参考 API 文档

    #include <ve-tls-cpp-sdk/TlsClient.h>
    #include <ve-tls-cpp-sdk/TlsClientConfig.h>
    #include <ve-tls-cpp-sdk/TlsRequest.h>
    #include <ve-tls-cpp-sdk/TlsJsonConversion.h>
    #include <ve-tls-cpp-sdk/TlsResponse.h>
    
    int main(int argc, char **argv) {
        ......
        {
            CreateProjectRequest request; {
                request.region = std::make_shared<std::string>("cn-guilin-boe");
                request.description = std::make_shared<std::string>("eren test cpp sdk");
                request.project_name = std::make_shared<std::string>("cppsdkunittest");
            }
            auto resp = client.CreateProject(request);
        }
        ......
    }
    

    您将得到类似如下的响应:

    CreateProjectResponse: {"StatusCode":200,"ProjectId":"XXXX","RequestId":"XXX"}
    
  3. 创建日志主题。
    您可以通过 TLS Client 进行日志主题的管理,例如创建和删除日志主题。对应的参数设置请参考 API 文档

    #include <ve-tls-cpp-sdk/TlsClient.h>
    #include <ve-tls-cpp-sdk/TlsClientConfig.h>
    #include <ve-tls-cpp-sdk/TlsRequest.h>
    #include <ve-tls-cpp-sdk/TlsJsonConversion.h>
    #include <ve-tls-cpp-sdk/TlsResponse.h>
    
    int main(int argc, char **argv) {
        ......
        {
            CreateTopicRequest request; {
                request.topic_name = std::make_shared<std::string>("cpptesttopic");
                request.project_id = std::make_shared<std::string>("XXX");
                request.ttl = std::make_shared<int>(7);
                request.shard_count = std::make_shared<int>(2);
                request.auto_split = std::make_shared<bool>(true);
                request.max_split_shard = std::make_shared<int>(10);
            }
            auto resp = client.CreateTopic(request);
        }
        ......
    }
    

    您将得到类似如下的响应:

    CreateTopicResponse: {"RequestId":"XXXX","StatusCode":200,"TopicId":"XXXX"}
    

通过 TLS Client 上传日志

您可以通过 TLS Client 向指定日志主题上传日志,相关示例代码如下。上传日志的参数设置请参考 API 文档
成功上传日志后,稍后您可以在控制台中查看实时采集到服务端的日志数据,或通过 SearchLogs 接口检索已上传的日志数据。

#include <ve-tls-cpp-sdk/TlsClient.h>
#include <ve-tls-cpp-sdk/TlsClientConfig.h>
#include <ve-tls-cpp-sdk/TlsRequest.h>
#include <ve-tls-cpp-sdk/TlsJsonConversion.h>
#include <ve-tls-cpp-sdk/TlsResponse.h>

int main(int argc, char **argv) {
    ......
    // PutLogs
    {
        auto pb = std::make_shared<pb::LogGroupList>();
        auto log_group = pb->add_loggroups();
        auto log = log_group->add_logs();
        log->set_time(time(nullptr));
        auto log_content = log->add_contents();
        log_content->set_key("cpptestkey");
        log_content->set_value("cpptestvalue");
        PutLogsRequest request; {
            request.topic_id = std::make_shared<std::string>("XXX");
            request.log_group_list = pb;
        }
        auto resp = client.PutLogs(request);
    }
    ......
}

使用 PutLogs V2接口上传日志

定义 Protobuf 上传日志的方式较为繁琐,在对日志上传服务的性能要求不高的场景下,可以使用 TLS C++ SDK 提供的 PutLogs V2 接口,无需组装复杂的日志结构,使用语言原生内置的数据结构即可完成日志上传。示例代码如下:

#include <ve-tls-cpp-sdk/TlsClient.h>
#include <ve-tls-cpp-sdk/TlsClientConfig.h>
#include <ve-tls-cpp-sdk/TlsRequest.h>
#include <ve-tls-cpp-sdk/TlsJsonConversion.h>
#include <ve-tls-cpp-sdk/TlsResponse.h>

int main(int argc, char **argv) {
    ......
    PutLogsV2Request request; {
        request.topic_id = std::make_shared<std::string>("XXX");
        request.source = std::make_shared<std::string>("sdkut");
        request.filename = std::make_shared<std::string>("utstdout");
        request.logs = std::make_shared<std::vector<LogItem>>();
        request.logs->push_back(LogItem());
        (*request.logs)[0].log_content["cpptestkey"] = "cpptestvalue";
    }
    client.PutLogsV2(request);
    ......
}