wxr
2024-08-27 bfb3d0d4879dca8c59ff287c92f5113162f3a33a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using Android.Content;
using Com.Aliyun.Sls.Android.Producer;
using Java.IO;
 
namespace HDL_ON_Android.Aliyu
{
    public class AliyuLogProducerClient : Java.Lang.Object, ILogProducerCallback
    {
        private static string TAG = "ProducerClient";
        LogProducerClient client = null;
        private Context context;
        protected string endpoint;
        protected string logProject;
        protected string logStore;
        protected string accessKeyId;
        protected string accessKeySecret;
        protected string accessKeyToken;
        protected string pluginAppId;
 
        public AliyuLogProducerClient(Context context, string endpoint, string logProject, string logStore, string accessKeyId, string accessKeySecret, string accessKeyToken, string pluginAppId)
        {
            this.context = context;
            this.endpoint = endpoint;
            this.logProject = logProject;
            this.logStore = logStore;
            this.accessKeyId = accessKeyId;
            this.accessKeySecret = accessKeySecret;
            this.accessKeyToken = accessKeyToken;
            this.pluginAppId = pluginAppId;
        }
 
 
        public void initProducer()
        {
            try
            {
                // endpoint 必须是以 https:// 或 http:// 开头的链接
                string endpoint = this.endpoint;
                string project = this.logProject;
                string logstore = this.logStore;
                string accessKeyId = this.accessKeyId;
                string accessKeySecret = this.accessKeySecret;
                string accessKeyToken = this.accessKeyToken;
 
                LogProducerConfig config = new LogProducerConfig(context, endpoint, project, logstore, accessKeyId, accessKeySecret, accessKeyToken);
                // 设置主题
                config.SetTopic("test_topic");
                // 设置tag信息,此tag会附加在每条日志上
                config.AddTag("test", "test_tag");
                // 每个缓存的日志包的大小上限,取值为1~5242880,单位为字节。默认为1024 * 1024
                config.SetPacketLogBytes(1024 * 1024);
                // 每个缓存的日志包中包含日志数量的最大值,取值为1~4096,默认为1024
                config.SetPacketLogCount(1024);
                // 被缓存日志的发送超时时间,如果缓存超时,则会被立即发送,单位为毫秒,默认为3000
                config.SetPacketTimeout(3000);
                // 单个Producer Client实例可以使用的内存的上限,超出缓存时add_log接口会立即返回失败
                // 默认为64 * 1024 * 1024
                config.SetMaxBufferLimit(64 * 1024 * 1024);
                // 发送线程数,默认为1
                config.SetSendThreadCount(1);
 
                //网络连接超时时间,整数,单位秒,默认为10
                config.SetConnectTimeoutSec(10);
                //日志发送超时时间,整数,单位秒,默认为15
                config.SetSendTimeoutSec(10);
                //flusher线程销毁最大等待时间,整数,单位秒,默认为1
                config.SetDestroyFlusherWaitSec(2);
                //sender线程池销毁最大等待时间,整数,单位秒,默认为1
                config.SetDestroySenderWaitSec(2);
                //数据上传时的压缩类型,默认为LZ4压缩,0 不压缩,1 LZ4压缩,默认为1
                config.SetCompressType(1);
                //设备时间与标准时间之差,值为标准时间-设备时间,一般此种情况用户客户端设备时间不同步的场景
                //整数,单位秒,默认为0;比如当前设备时间为1607064208, 标准时间为1607064308,则值设置为 1607064308 - 1607064208 = 10
                config.SetNtpTimeOffset(3);
                //日志时间与本机时间之差,超过该大小后会根据 `drop_delay_log` 选项进行处理。
                //一般此种情况只会在设置persistent的情况下出现,即设备下线后,超过几天/数月启动,发送退出前未发出的日志
                //整数,单位秒,默认为7*24*3600,即7天
                config.SetMaxLogDelayTime(7 * 24 * 3600);
                //对于超过 `max_log_delay_time` 日志的处理策略
                //0 不丢弃,把日志时间修改为当前时间; 1 丢弃,默认为 1 (丢弃)
                config.SetDropDelayLog(0);
                //是否丢弃鉴权失败的日志,0 不丢弃,1丢弃
                //默认为 0,即不丢弃
                config.SetDropUnauthorizedLog(0);
                // 是否使用主线程回调
                // false: 使用主线程回调。回调会在主线程上执行,且每个 client 都有自己单独的回调。
                // true: 使用 sender 线程回调。回调会在 sender 现呈上执行,每次执行回调时都会 attach 一个新的 java 线程,所有 client 共用一个回调。
                // 注意:默认使用 sender 线程回调。
                config.SetCallbackFromSenderThread(false);
 
                /**
                 * 以下为开启断点续传的配置, 按照如下配置开启断点续传功能后, 日志会先缓存到本地
                 */
                // 1 开启断点续传功能, 0 关闭
                // 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
                config.SetPersistent(1);
                // 持久化的文件名,需要保证文件所在的文件夹已创建。
                // !!!!!!!!!!!!!!!!!!!注意!!!!!!!!!!!!!!!!!!!
                // 配置多个客户端时,不应设置相同文件
                config.SetPersistentFilePath(context.FilesDir + string.Format("%slog_data.dat", File.Separator));
                // 是否每次AddLog强制刷新,高可靠性场景建议打开
                config.SetPersistentForceFlush(0);
                // 持久化文件滚动个数,建议设置成10。
                config.SetPersistentMaxFileCount(10);
                // 每个持久化文件的大小,建议设置成1-10M
                config.SetPersistentMaxFileSize(1024 * 1024);
                // 本地最多缓存的日志数,不建议超过1M,通常设置为65536即可
                config.SetPersistentMaxLogCount(65536);
 
                client = new LogProducerClient(config, this);
            }
            catch (LogProducerException e)
            {
 
            }
 
        }
        public void sendLog(Log log)
        {
            LogProducerResult result = client.AddLog(log);
        }
        //callback为可选配置, 如果不需要关注日志的发送成功或失败状态, 可以不注册 callback
        public void OnCall(int resultCode, string reqId, string errorMessage, int logBytes, int compressedBytes)
        {
            //        // resultCode: 状态码, 详见 LogProducerResult
            //        // reqId: 请求Id, 已经废弃
            //        // errorMessage: 失败信息
            //        // logBytes: 日志原始字节数
            //        // compressedBytes: 日志压缩字节数
        }
    }
}