All Projects → aliyun → Aliyun Log Android Sdk

aliyun / Aliyun Log Android Sdk

Licence: mit

Programming Languages

c
50402 projects - #5 most used programming language

log service android producer

基于aliyun-log-c-sdk ,提供了在Android平台上将日志采集到日志服务的接口。

功能特点

  • 异步
    • 异步写入,客户端线程无阻塞
  • 聚合&压缩 上传
    • 支持按超时时间、日志数、日志size聚合数据发送
    • 支持lz4压缩
  • 多客户端
    • 可同时配置多个客户端,每个客户端可独立配置采集优先级、缓存上限、目的project/logstore、聚合参数等
  • 缓存
    • 支持缓存上限可设置
    • 超过上限后日志写入失败
  • 自定义标识
    • 支持设置自定义tag、topic
  • 断点续传功能
    • 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once(配置多个客户端时,不应设置相同持久化文件)
  • 上下文
    • 采集上来的日志,支持查看某条日志的上下文

image.png

性能测试

  • 开启断点续传
发送 条/每秒 cpu占用 内存占用(MB) 上传速(MB/min)
1 <1% 49 0.046
10 2% 53 0.442
100 8% 57 4.393
200 10% 70 7.90
  • 不开启断点续传
发送 条/每秒 cpu占用 内存占用(MB) 上传速(MB/min)
1 <1% 49 0.046
10 2% 58 0.442
100 10% 60 4.393
200 15% 70 7.90

SDK包体积

  • aar包体积

aar包体积.png

  • 引用SDK包前后体积对比

引用SDK包前后体积对比.png

配置说明

环境要求

  • Android版本4.0(API 14)及以上。
  • 必须注册有Aliyun.com用户账户,并开通相应的服务(LOG)。

Gradle配置

jcenter()
implementation 'com.aliyun.openservices:aliyun-log-android-sdk:2.5.13'

混淆配置

-keep class com.aliyun.sls.android.producer.* { *; }
-keep interface com.aliyun.sls.android.producer.* { *; }

Android权限

上传日志需要

<uses-permission android:name="android.permission.INTERNET" />

开启断点续传功能需要有持久化文件的读写权限

创建config

https://help.aliyun.com/document_detail/29064.html

// endpoint前需要加 https://
String endpoint = "project's_endpoint";
String project = "project_name";
String logstore = "logstore_name";
String accesskeyid = "your_accesskey_id";
String accesskeysecret = "your_accesskey_secret";
LogProducerConfig config = new LogProducerConfig(endpoint, project, logstore, accesskeyid, accesskeysecret);
// 指定sts token 创建config,过期之前调用resetSecurityToken重置token
// LogProducerConfig config = new LogProducerConfig(endpoint, project, logstore, accesskeyid, accesskeysecret, securityToken);

配置config

// 设置主题
config.setTopic("test_topic");
// 设置tag信息,此tag会附加在每条日志上
config.addTag("test", "test_topic");
// 每个缓存的日志包的大小上限,取值为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);

// 1 开启断点续传功能, 0 关闭
// 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
config.setPersistent(0);
// 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件
config.setPersistentFilePath(getFilesDir() + "/log.dat");
// 是否每次AddLog强制刷新,高可靠性场景建议打开
config.setPersistentForceFlush(1);
// 持久化文件滚动个数,建议设置成10。
config.setPersistentMaxFileCount(10);
// 每个持久化文件的大小,建议设置成1-10M
config.setPersistentMaxFileSize(1024 * 1024);
// 本地最多缓存的日志数,不建议超过1M,通常设置为65536即可
config.setPersistentMaxLogCount(65536);

config其他参数说明

参数 说明 取值
connect_timeout_sec 网络连接超时时间 整数,单位秒,默认为10
send_timeout_sec 日志发送超时时间 整数,单位秒,默认为15
destroy_flusher_wait_sec flusher线程销毁最大等待时间 整数,单位秒,默认为1
destroy_sender_wait_sec sender线程池销毁最大等待时间 整数,单位秒,默认为1
compress_type 数据上传时的压缩类型,默认为LZ4压缩 0 不压缩,1 LZ4压缩, 默认为1
ntp_time_offset 设备时间与标准时间之差,值为标准时间-设备时间,一般此种情况用户客户端设备时间不同步的场景 整数,单位秒,默认为0;比如当前设备时间为1607064208, 标准时间为1607064308,则值设置为 1607064308 - 1607064208 = 100
max_log_delay_time 日志时间与本机时间之差,超过该大小后会根据 drop_delay_log 选项进行处理。一般此种情况只会在设置persistent的情况下出现,即设备下线后,超过几天/数月启动,发送退出前未发出的日志 整数,单位秒,默认为7243600,即7天
drop_delay_log 对于超过 max_log_delay_time 日志的处理策略 0 不丢弃,把日志时间修改为当前时间; 1 丢弃,默认为 1 (丢弃)
drop_unauthorized_log 是否丢弃鉴权失败的日志,0 不丢弃,1丢弃 整数,默认为 0,即不丢弃

设置回调函数,创建client

// 回调函数不填,默认无回调
LogProducerClient client = new LogProducerClient(config, new LogProducerCallback() {
    @Override
    public void onCall(int resultCode, String reqId, String errorMessage, int logBytes, int compressedBytes) {
        // 回调
        // resultCode       返回结果代码
        // reqId            请求id
        // errorMessage     错误信息,没有为null
        // logBytes         日志大小
        // compressedBytes  压缩后日志大小
        android.util.Log.d("LogProducerCallback",String.format("%s %s %s %s %s",
                                LogProducerResult.fromInt(resultCode), reqId, errorMessage, logBytes, compressedBytes));
    }
});

写数据

Log log = new Log();
log.putContent("k1", "v1");
log.putContent("k2", "v2");
// addLog第二个参数flush,是否立即发送,1代表立即发送,不设置时默认为0
LogProducerResult res = client.addLog(log, 0);
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].