本文介绍如何快速使用日志服务 C++ SDK 实现基础的日志采集流程,包括创建日志项目、创建日志主题、写入日志等操作。
在使用 C++ SDK 前,请确保您已完成以下事项:
VOLCENGINE_ACCESS_KEY_ID
等环境变量。环境变量的配置方式请参考配置身份认证信息。初始化 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); }
创建日志项目。
您可以通过 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"}
创建日志主题。
您可以通过 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>(50); } auto resp = client.CreateTopic(request); } ...... }
您将得到类似如下的响应:
CreateTopicResponse: {"RequestId":"XXXX","StatusCode":200,"TopicId":"XXXX"}
您可以通过 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); } ...... }
定义 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); ...... }