Sources/Core/SLSSdkSender.m (191 lines of code) (raw):

// // SLSSdkSender.m // AliyunLogCore // // Created by gordon on 2022/7/20. // #import "SLSSdkSender.h" #import "SLSProducer.h" @interface SLSSdkSender () @property(nonatomic, strong) LogProducerClient *client; @property(nonatomic, strong) LogProducerConfig *config; - (NSString *) getLogstoreByInstanceId: (NSString *) instanceId; @end @implementation SLSSdkSender - (instancetype)init { self = [super init]; if (self) { } return self; } + (instancetype) sender { return [[SLSSdkSender alloc] init]; } - (NSString *) provideFeatureName { return @"default"; } - (NSString *) provideLogFileName: (SLSCredentials *) credentials { return @"data.dat"; } - (NSString *) provideEndpoint: (SLSCredentials *) credentials { return credentials.endpoint; } - (NSString *) provideProjectName: (SLSCredentials *) credentials { return credentials.project; } - (NSString *) provideLogstoreName: (SLSCredentials *) credentials { return [self getLogstoreByInstanceId:credentials.instanceId]; } - (NSString *) provideAccessKeyId: (SLSCredentials *) credentials { return credentials.accessKeyId; } - (NSString *) provideAccessKeySecret: (SLSCredentials *) credentials { return credentials.accessKeySecret; } - (NSString *) provideSecurityToken: (SLSCredentials *) credentials { return credentials.securityToken; } - (void) provideLogProducerConfig: (id) config { } - (void) initialize: (SLSCredentials *) credentials { NSString *endpoint = [self provideEndpoint:credentials]; NSString *project = [self provideProjectName:credentials]; NSString *logstore = [self provideLogstoreName:credentials]; NSString *accessKeyId = [self provideAccessKeyId:credentials]; NSString *accessKeySecret = [self provideAccessKeySecret:credentials]; NSString *securityToken = [self provideSecurityToken:credentials]; _config = [[LogProducerConfig alloc] initWithEndpoint:endpoint project:project logstore:logstore accessKeyID:accessKeyId accessKeySecret:accessKeySecret securityToken:securityToken ]; [_config SetTopic:@"sls_cocoa"]; [_config SetPacketLogBytes:(1024 * 1024)]; [_config SetPacketLogCount: 4096]; [_config SetPacketTimeout:2000]; [_config SetMaxBufferLimit:(64*1024*1024)]; [_config SetSendThreadCount:1]; NSString *fileName = [self provideLogFileName:credentials]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [[[paths lastObject] stringByAppendingPathComponent:@"sls"] stringByAppendingPathComponent:@"logs"]; BOOL isDir = FALSE; if (![[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) { [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]; } [_config SetPersistent:1]; [_config SetPersistentFilePath:[path stringByAppendingPathComponent:fileName]]; [_config SetPersistentForceFlush:0]; [_config SetPersistentMaxFileCount:10]; [_config SetPersistentMaxFileSize:(1024*1024*10)]; [_config SetPersistentMaxLogCount:65536]; [_config SetDropDelayLog:0]; [_config SetDropUnauthorizedLog:0]; [self provideLogProducerConfig:_config]; _client = [[LogProducerClient alloc] initWithLogProducerConfig:self.config callback:_on_log_send_done userparams:self]; } - (BOOL) send: (Log *) log { if (!_client) { return NO; } return LogProducerOK == [_client AddLog:log]; } - (BOOL) onEnd: (SLSSpan *)span { if (!span) { return NO; } Log *log = [Log log]; [log putContents:[span toDict]]; return [self send:log]; } - (void) setCredentials: (SLSCredentials *) credentials { if (!_config || !credentials) { return; } NSString *securityToken = [self provideSecurityToken:credentials]; NSString *accessKeyId = [self provideAccessKeyId:credentials]; NSString *accessKeySecret = [self provideAccessKeySecret:credentials]; if (securityToken.length > 0) { if (accessKeyId.length > 0 && accessKeySecret.length > 0) { [_config ResetSecurityToken:accessKeyId accessKeySecret:accessKeySecret securityToken:securityToken ]; } } else { if (accessKeyId.length > 0 && accessKeySecret.length > 0) { [_config setAccessKeyId: accessKeyId]; [_config setAccessKeySecret: accessKeySecret]; } } NSString *endpoint = [self provideEndpoint:credentials]; NSString *project = [self provideProjectName:credentials]; NSString *logstore = [self provideLogstoreName:credentials]; if (endpoint.length > 0) { [_config setEndpoint:endpoint]; } if (project.length > 0) { [_config setProject:project]; } if (logstore.length > 0) { [_config setLogstore:logstore]; } } - (void) setCallback:(nullable CredentialsCallback) callback { _callback = callback; } - (NSString *) getLogstoreByInstanceId: (NSString *) instanceId { if (!instanceId) { return @""; } return [NSString stringWithFormat:@"%@-track-raw", instanceId]; } static 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 (LogProducerOK == result) { SLSLogV(@"result code: %d, errorMessage: %s, logstore: %s", result, message, config_name); } else { SLSLog(@"result code: %d, errorMessage: %s, logstore: %s", result, message, config_name); } SLSSdkSender *sender = (__bridge SLSSdkSender *)userparams; if (sender && sender->_callback) { sender->_callback([sender provideFeatureName], result2String(result)); } } static NSString * result2String(log_producer_result result) { switch (result) { case LogProducerOK: return @"LogProducerOK"; case LogProducerInvalid: return @"LogProducerInvalid"; case LogProducerWriteError: return @"LogProducerWriteError"; case LogProducerDropError: return @"LogProducerDropError"; case LogProducerSendNetworkError: return @"LogProducerSendNetworkError"; case LogProducerSendQuotaError: return @"LogProducerSendQuotaError"; case LogProducerSendUnauthorized: return @"LogProducerSendUnauthorized"; case LogProducerSendServerError: return @"LogProducerSendServerError"; case LogProducerSendDiscardError: return @"LogProducerSendDiscardError"; case LogProducerSendTimeError: return @"LogProducerSendTimeError"; case LogProducerSendExitBufferdF: return @"LogProducerSendExitBufferdF"; case LogProducerParametersInvalid: return @"LogProducerParametersInvalid"; case LogProducerPERSISTENT_Error: return @"LogProducerPERSISTENT_Error"; } return @"LogProducerUnknown"; } @end