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: 日志压缩字节数 } } }