OC代码如下
//
// AliyunLog.m
// AliyunLogProducerSampleOC
//
// Created by lichao on 2020/9/27.
// Copyright © 2020 lichao. All rights reserved.
//
#import "AliyunLog.h"
#import "AliyunLogProducer/AliyunLogProducer.h"
LogProducerClient* client = nil;
LogProducerClient* config = nil;
void on_log_send_done(const char * config_name, log_producer_result result, size_t log_bytes, size_t compressed_bytes, const char * req_id, const char * message, const unsigned char * raw_buffer, void * userparams) {
if (result == LOG_PRODUCER_OK) {
printf("aaaa send success, config : %s, result : %d, log bytes : %d, compressed bytes : %d, request id : %s \n", config_name, (result), (int)log_bytes, (int)compressed_bytes, req_id);
} else {
printf("aaaa send fail , config : %s, result : %d, log bytes : %d, compressed bytes : %d, request id : %s \n, error message : %s\n", config_name, (result), (int)log_bytes, (int)compressed_bytes, req_id, message);
}
}
LogProducerConfig* Internal_CreateConfig(char* endpoint,char* project, char* logstore, char* accesskeyid, char* accesskeysecret, char* securityToken) {
NSString * endpointStr= [NSString stringWithFormat:@"%s",endpoint];
NSString * projectStr= [NSString stringWithFormat:@"%s",project];
NSString * logstoreStr= [NSString stringWithFormat:@"%s",logstore];
NSString * accesskeyidStr= [NSString stringWithFormat:@"%s",accesskeyid];
NSString * accesskeysecretStr= [NSString stringWithFormat:@"%s",accesskeysecret];
NSString * securityTokenStr= [NSString stringWithFormat:@"%s",securityToken];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *Path = [[paths lastObject] stringByAppendingString:@"/log.dat"];
LogProducerConfig* config = [[LogProducerConfig alloc] initWithEndpoint:endpointStr project:projectStr logstore:logstoreStr accessKeyID:accesskeyidStr accessKeySecret:accesskeysecretStr securityToken:securityTokenStr];
// 设置主题
[config SetTopic:@"test_topic"];
// 设置tag信息,此tag会附加在每条日志上
[config AddTag:@"test" value:@"test_tag"];
// 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];
return config;
}
LogProducerClient* Internal_Init (LogProducerConfig* config )
{
//创建client
client = [[LogProducerClient alloc] initWithLogProducerConfig:config callback:on_log_send_done];
return client;
}
void Internal_ResetToken (LogProducerConfig* config , char* accesskeyid, char* accesskeysecret, char* securityToken)
{
NSString * accesskeyidStr= [NSString stringWithFormat:@"%s",accesskeyid];
NSString * accesskeysecretStr= [NSString stringWithFormat:@"%s",accesskeysecret];
NSString * securityTokenStr= [NSString stringWithFormat:@"%s",securityToken];
[config ResetSecurityToken: accesskeyidStr accessKeySecret:accesskeysecretStr securityToken:securityTokenStr];
}
Log* Internal_CreateLog()
{
Log* log = [[Log alloc] init];
int logTime = [[NSDate date] timeIntervalSince1970];
[log SetTime:logTime];
return log;
}
void Internal_PutContent(Log* log,char* key, char* value)
{
NSString * keyStr= [NSString stringWithFormat:@"%s",key];
NSString * valueStr= [NSString stringWithFormat:@"%s",value];
[log PutContent:keyStr value:valueStr];
}
void Internal_SendLog(Log* log)
{
LogProducerResult res = [client AddLog:log];
}
对应的Java代码
import android.app.Activity;
import android.util.Log;
import com.aliyun.sls.android.producer.LogProducerCallback;
import com.aliyun.sls.android.producer.LogProducerClient;
import com.aliyun.sls.android.producer.LogProducerConfig;
import com.aliyun.sls.android.producer.LogProducerException;
import com.aliyun.sls.android.producer.LogProducerResult;
public class ALiYunLogAdapter {
private static LogProducerConfig config;
private static LogProducerClient client;
public static LogProducerConfig CreateConfig(Activity unityActivity, String endpoint, String project, String logstore, String accessKeyID,
String accessKeySecret, String securityToken) throws LogProducerException {
if (config != null){
Log.e("unity", "Unity CreateConfig: config已经不为空,是否重复调用了!!");
}
if (securityToken.isEmpty()){
config = new LogProducerConfig(unityActivity, endpoint, project, logstore, accessKeyID, accessKeySecret);
}else {
config = new LogProducerConfig(unityActivity, endpoint, project, logstore, accessKeyID, accessKeySecret, securityToken);
}
// 1 开启断点续传功能, 0 关闭
// 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
config.setPersistent(0);
// 是否每次AddLog强制刷新,高可靠性场景建议打开
config.setPersistentForceFlush(1);
// 持久化文件滚动个数,建议设置成10。
config.setPersistentMaxFileCount(10);
// 每个持久化文件的大小,建议设置成1-10M
config.setPersistentMaxFileSize(1024 * 1024);
// 本地最多缓存的日志数,不建议超过1M,通常设置为65536即可
config.setPersistentMaxLogCount(65536);
config.logProducerDebug();
return config;
}
public static void Init(LogProducerConfig config) throws LogProducerException {
client = new LogProducerClient(config, new LogProducerCallback() {
@Override
public void onCall(int resultCode, String reqId, String errorMessage, int logBytes, int compressedBytes) {
Log.e("unity", String.format("Unity ALiYunLog: \nresultCode: %s\nreqId: %s\nerrorMessage: %s\nlogBytes: %s\ncompressedBytes: %s", LogProducerResult.fromInt(resultCode), reqId, errorMessage, logBytes, compressedBytes));
}
});
}
public static void ResetToken(String accessKeyID, String accessKeySecret, String securityToken){
config.resetSecurityToken(accessKeyID, accessKeySecret, securityToken);
}
public static com.aliyun.sls.android.producer.Log CreateLog(){
return new com.aliyun.sls.android.producer.Log();
}
public static void SendLog(com.aliyun.sls.android.producer.Log log){
if (client != null) {
LogProducerResult res = client.addLog(log);
Log.i("unity", String.format("Unity SendLog: res: %s isLogProducerResultOk: %s%n", res, res.isLogProducerResultOk()));
}else{
Log.e("unity", "Unity SendLog: Log适配器没有初始化!! ALiYunLogAdapter.Init()");
}
}
public static String HelpString(){
return "\n // 设置主题\n" +
" config.setTopic(\"test_topic\");\n" +
" // 设置tag信息,此tag会附加在每条日志上\n" +
" config.addTag(\"test\", \"test_tag\");\n" +
" // 每个缓存的日志包的大小上限,取值为1~5242880,单位为字节。默认为1024 * 1024\n" +
" config.setPacketLogBytes(1024 * 1024);\n" +
" // 每个缓存的日志包中包含日志数量的最大值,取值为1~4096,默认为1024\n" +
" config.setPacketLogCount(1024);\n" +
" // 被缓存日志的发送超时时间,如果缓存超时,则会被立即发送,单位为毫秒,默认为3000\n" +
" config.setPacketTimeout(3000);\n" +
" // 单个Producer Client实例可以使用的内存的上限,超出缓存时add_log接口会立即返回失败\n" +
" // 默认为64 * 1024 * 1024\n" +
" config.setMaxBufferLimit(64 * 1024 * 1024);\n" +
" // 发送线程数,默认为1\n" +
" config.setSendThreadCount(1);\n" +
"\n" +
" // 1 开启断点续传功能, 默认 0 关闭\n" +
" // 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once\n" +
" config.setPersistent(0);\n" +
" // 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件\n" +
" config.setPersistentFilePath(getFilesDir() + \"/log.dat\");\n" +
" // 是否每次AddLog强制刷新,高可靠性场景建议打开(适配器已配置)\n" +
" config.setPersistentForceFlush(1);\n" +
" // 持久化文件滚动个数,建议设置成10。(适配器已配置)\n" +
" config.setPersistentMaxFileCount(10);\n" +
" // 每个持久化文件的大小,建议设置成1-10M(适配器已配置)\n" +
" config.setPersistentMaxFileSize(1024 * 1024);\n" +
" // 本地最多缓存的日志数,不建议超过1M,通常设置为65536即可(适配器已配置)\n" +
" config.setPersistentMaxLogCount(65536);\n" +
"\n" +
" //网络连接超时时间,整数,单位秒,默认为10\n" +
" config.setConnectTimeoutSec(10);\n" +
" //日志发送超时时间,整数,单位秒,默认为15\n" +
" config.setSendTimeoutSec(10);\n" +
" //flusher线程销毁最大等待时间,整数,单位秒,默认为1\n" +
" config.setDestroyFlusherWaitSec(2);\n" +
" //sender线程池销毁最大等待时间,整数,单位秒,默认为1\n" +
" config.setDestroySenderWaitSec(2);\n" +
" //数据上传时的压缩类型,默认为LZ4压缩,0 不压缩,1 LZ4压缩,默认为1\n" +
" config.setCompressType(1);\n" +
" //设备时间与标准时间之差,值为标准时间-设备时间,一般此种情况用户客户端设备时间不同步的场景\n" +
" //整数,单位秒,默认为0;比如当前设备时间为1607064208, 标准时间为1607064308,则值设置为 1607064308 - 1607064208 = 10\n" +
" config.setNtpTimeOffset(3);\n" +
" //日志时间与本机时间之差,超过该大小后会根据 `drop_delay_log` 选项进行处理。\n" +
" //一般此种情况只会在设置persistent的情况下出现,即设备下线后,超过几天/数月启动,发送退出前未发出的日志\n" +
" //整数,单位秒,默认为7*24*3600,即7天\n" +
" config.setMaxLogDelayTime(7 * 24 * 3600);\n" +
" //对于超过 `max_log_delay_time` 日志的处理策略\n" +
" //0 不丢弃,把日志时间修改为当前时间; 1 丢弃,默认为 1 (丢弃)\n" +
" config.setDropDelayLog(0);\n" +
" //是否丢弃鉴权失败的日志,0 不丢弃,1丢弃\n" +
" //默认为 0,即不丢弃\n" +
" config.setDropUnauthorizedLog(0);";
}
}