更新时间:2024-12-23 GMT+08:00
分享

云日志服务Net SDK

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

传输协议

HTTPS

使用前提

使用说明

当用户修改权限后,权限信息在一天后生效。通过SDK上报日志到LTS的时间相距当前时间不超过2天,否则上报日志会被LTS删除。

注意事项

认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。

操作步骤

  1. 获取LTS Net SDK包源码。

    git clone https://gitee.com/lordstar-habile/huaweicloud-lts-dotnet-sdk.git

  2. 安装相关依赖。

    dotnet add package Microsoft.Extensions.Http.Polly --version 8.0.2 
    dotnet add package RestSharp --version 110.2.0 
    dotnet add package Newtonsoft.Json --version 13.0.3

  3. 编写上报日志代码。

    可以自定义发送成功与失败时的回调方法,实现CallBack的abstract class,实现Success和Fail方法,并且在发送日志时直接使用。

    public Error SendLogWithCallBack(string groupId, string streamId, Log log, CallBack callBack)

    示例如下:

    using HuaweiCloud.SDK.LTS.Model;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace HuaweiCloud.SDK.LTS.Sample
    {
        public class Sample
        {
            public static void SendLogToLts(string endpoint, string accessKey, string accessSecret, string region, string projectId, string groupId, string streamId,
                int threadCount, int logItemNum, int HttpTimeout, int LingerMs, string logContent, long maxIO)
            {
                Console.WriteLine("start time is: {0}", DateTimeOffset.Now.ToUnixTimeMilliseconds());
                var producerConfig = Config.GetConfig();
                producerConfig.LingerMs = LingerMs;
                producerConfig.Endpoint = endpoint;
                producerConfig.AccessKeyID = accessKey;
                producerConfig.AccessKeySecret = accessSecret;
                producerConfig.RegionId = region;
                producerConfig.ProjectId = projectId;
                producerConfig.HttpMaxTimeout = HttpTimeout;
                producerConfig.MaxIoWorkers = maxIO;
                var producerInstance = new Producer(producerConfig);
    
                producerInstance.Start();
                var wg = new WaitGroup();
                for (int i = 0; i < threadCount; i++)
                {
                    wg.Add(1);
                    Task.Run(() => Handler.handle(producerInstance, wg, groupId, streamId, logItemNum, logContent));
                }
    
                wg.wait();
                Console.WriteLine("send all complate ...");
                Thread.Sleep(TimeSpan.FromSeconds(3000));
            }
    
            public class WaitGroup
            {
                private long _wg = 0;
    
                public long Wg
                {
                    get => _wg;
                    set => _wg = value;
                }
    
                public void Add(int delta)
                {
                    Interlocked.Add(ref _wg, delta);
                }
    
                public void Done()
                {
                    Interlocked.Decrement(ref _wg);
                }
    
                public void wait()
                {
                    while (Interlocked.Read(ref _wg) != 0)
                    {
                        Thread.Sleep(200);
                    }
                }
            }
    
            public class Handler
            {
                public static void handle(Producer producer, WaitGroup wg, string groupId, string streamId, int logItemNums, string logContent)
                {
                    for (int j = 0; j < logItemNums; j++)
                    {
                        var labels = new Dictionary<string, string>();
                        labels["keyA"] = "valueA";
                        labels["keyB"] = "valueB";
                        labels["keyC"] = "valueC";
                        var log = LTS_Store.GenerateLog(new List<string> { logContent }, labels);
                        var err = producer.SendLog(groupId, streamId, log);
                        if (err != null)
                        {
                            Console.WriteLine(JsonConvert.SerializeObject(err));
                        }
    
                        Thread.Sleep(TimeSpan.FromMilliseconds(0.1));
                    }
    
                    wg.Done();
                }
            }
        }
    }

配置参数说明

  • producer config参数说明。

    参数名称

    描述

    类型

    是否需要填写

    默认值

    ProjectId

    华为云账号的项目ID(project id)。

    String

    必填

    -

    AccessKeyId

    华为云号的AK。

    String

    必填

    -

    AccessKeySecret

    华为云号的SK。

    String

    必填

    -

    RegionName

    云日志服务的区域。

    String

    必填

    -

    Endpoint

    上报的服务器域名或IP。

    String

    必填

    -

    MaxBlockSec

    如果 producer 可用空间不足,调用者在 send 方法上的最大阻塞时间,默认为 60 秒。建议为0秒。

    当maxBlockMs值>=0时,则阻塞到设置的时间,如果到达阻塞时间,还是不能获取到内存,即报错且丢弃日志。

    当maxBlockMs值=-1时,则一直阻塞到发送成功,且不会丢弃日志。

    long

    选填

    60S

    MaxIoWorkers

    执行日志发送任务的任务池大小。

    int

    选填

    默认10个

    MaxBatchSize

    当一个 ProducerBatch 中缓存的日志大小大于等于 batchSizeThresholdInBytes 时,该 batch 将被发送。

    int

    选填

    0.5M(512 * 1024)

    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

    HttpMaxTimeout

    HTTP请求的超时时间

    int

    选填

    60s

  • 日志生成GenerateLog方法类参数说明
    表1 GenerateLog方法类参数说明

    参数名称

    描述

    类型

    是否需要填写

    contents

    批量日志内容

    List<string>

    labels

    日志标签,map格式

    Dictionary<string, string>

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

  • 日志上报SendLog方法类参数说明
    表2 SendLog方法类参数说明

    参数名称

    描述

    类型

    是否需要填写

    groupId

    日志组id

    string

    streamId

    日志流id

    string

    log

    日志结构

    class Log

参数获取方式

  • 上线区域表,使用华为云主机时参考以下信息:

    区域名称

    RegionName

    Endpoint

    华北-北京四

    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。

相关文档