log service ios producer
功能特点
- 异步
- 聚合&压缩 上传
- 支持按超时时间、日志数、日志size聚合数据发送
- 支持lz4压缩
- 多客户端
- 可同时配置多个客户端,每个客户端可独立配置采集优先级、缓存上限、目的project/logstore、聚合参数等 (多客户端,断点续传文件路径不能相同)
- 缓存
- 自定义标识
- 断点续传功能
- 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
性能测试
发送 条/每秒 |
cpu占用 |
内存占用(MB) |
上传速(MB/min) |
1 |
<1% |
14.2 |
0.046 |
10 |
1% |
14.5 |
0.435 |
100 |
6% |
14.5 |
4.31 |
300 |
11% |
14.7 |
12.80 |
发送 条/每秒 |
cpu占用 |
内存占用(MB) |
上传速(MB/min) |
1 |
<1% |
14 |
0.046 |
10 |
1% |
14 |
0.437 |
100 |
6% |
14.1 |
4.50 |
300 |
9% |
14.4 |
13.47 |
Podfile
pod 'AliyunLogProducer', '~> 2.2.25'
swift 配置说明
import
import AliyunLogProducer
创建config
https://help.aliyun.com/document_detail/29064.html
// endpoint前需要加 https://
let endpoint = "project's_endpoint";
let project = "project_name";
let logstore = "logstore_name";
let accesskeyid = "your_accesskey_id";
let accesskeysecret = "your_accesskey_secret";
let config = LogProducerConfig(endpoint:endpoint, project:project, logstore:logstore, accessKeyID:accesskeyid, accessKeySecret:accesskeysecret)!
// 指定sts token 创建config,过期之前调用ResetSecurityToken重置token
// let config = LogProducerConfig(endpoint:endpoint, project:project, logstore:logstore, accessKeyID:accesskeyid, accessKeySecret:accesskeysecret, securityToken:securityToken)
配置config & 创建client
// 设置主题
config.setTopic("test_topic")
// 设置tag信息,此tag会附加在每条日志上
config.addTag("test", value:"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,不建议修改此配置
// 开启断点续传功能后,sendThreadCount强制为1
config.setSendThreadCount(1)
// 1 开启断点续传功能, 0 关闭
// 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
config.setPersistent(1)
// 持久化的文件名,需要保证文件所在的文件夹已创建。
let file = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first
let path = file! + "/log.dat"
config.setPersistentFilePath(path)
// 是否每次AddLog强制刷新,高可靠性场景建议打开
config.setPersistentForceFlush(1)
// 持久化文件滚动个数,建议设置成10。
config.setPersistentMaxFileCount(10)
// 每个持久化文件的大小,建议设置成1-10M
config.setPersistentMaxFileSize(1024*1024)
// 本地最多缓存的日志数,不建议超过1M,通常设置为65536即可
config.setPersistentMaxLogCount(65536)
config.setGetTimeUnixFunc({ () -> UInt32 in
let time = Date().timeIntervalSince1970
return UInt32(time);
})
let callbackFunc: on_log_producer_send_done_function = {config_name,result,log_bytes,compressed_bytes,req_id,error_message,raw_buffer,user_param in
let res = LogProducerResult(rawValue: Int(result))
// print(res!)
// let req = String(cString: req_id!)
// print(req)
// print(log_bytes)
// print(compressed_bytes)
}
client = LogProducerClient(logProducerConfig:config, callback:callbackFunc)
// client = LogProducerClient(logProducerConfig:config)
写数据
let log = Log()
let logTime = Date().timeIntervalSince1970
//不设置默认当前时间
log.setTime(useconds_t(logTime))
log.putContent("k1", value:"v1")
log.putContent("k2", value:"v2")
// addLog第二个参数flush,是否立即发送,1代表立即发送,不设置时默认为0
let res = client?.add(log, flush:0)
oc 配置说明
import
#import "AliyunLogProducer/AliyunLogProducer.h"
创建config
https://help.aliyun.com/document_detail/29064.html
// endpoint前需要加 https://
NSString* endpoint = @"project's_endpoint";
NSString* project = @"project_name";
NSString* logstore = @"logstore_name";
NSString* accesskeyid = @"your_accesskey_id";
NSString* accesskeysecret = @"your_accesskey_secret";
LogProducerConfig* config = [[LogProducerConfig alloc] initWithEndpoint:endpoint project:project logstore:logstore accessKeyID:accesskeyid accessKeySecret:accesskeysecret];
// 指定sts token 创建config,过期之前调用ResetSecurityToken重置token
// LogProducerConfig* config = [[LogProducerConfig alloc] initWithEndpoint:endpoint project:project logstore:logstore accessKeyID:accesskeyid accessKeySecret:accesskeysecret securityToken:securityToken];
配置config & 创建client
// 设置主题
[config SetTopic:@"test_topic"];
// 设置tag信息,此tag会附加在每条日志上
[config AddTag:@"test" value:@"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,不建议修改此配置
// 开启断点续传功能后,sendThreadCount强制为1
[config SetSendThreadCount:1];
// 1 开启断点续传功能, 0 关闭
// 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
[config SetPersistent:1];
// 持久化的文件名,需要保证文件所在的文件夹已创建。
[config SetPersistentFilePath:Path];
// 是否每次AddLog强制刷新,高可靠性场景建议打开
[config SetPersistentForceFlush:1];
// 持久化文件滚动个数,建议设置成10。
[config SetPersistentMaxFileCount:10];
// 每个持久化文件的大小,建议设置成1-10M
[config SetPersistentMaxFileSize:1024*1024];
// 本地最多缓存的日志数,不建议超过1M,通常设置为65536即可
[config SetPersistentMaxLogCount:65536];
// 注册 获取服务器时间 的函数
[config SetGetTimeUnixFunc:time];
//创建client
client = [[LogProducerClient alloc] initWithLogProducerConfig:config];
写数据
Log* log = [[Log alloc] init];
int logTime = [[NSDate date] timeIntervalSince1970];
//不设置默认当前时间
[log SetTime:logTime];
[log PutContent:@"k1" value:@"v1"];
[log PutContent:@"k2" value:@"v2"];
// addLog第二个参数flush,是否立即发送,1代表立即发送,不设置时默认为0
LogProducerResult res = [client AddLog:log flush:0];
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,即不丢弃 |