Sources/Producer/LogProducerClient.m (94 lines of code) (raw):
//
// LogProducerClient.m
// AliyunLogProducer
//
// Created by lichao on 2020/9/27.
// Copyright © 2020 lichao. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "LogProducerClient.h"
#import "LogProducerConfig.h"
#import "Log.h"
#import "TimeUtils.h"
@interface LogProducerClient ()
@end
@implementation LogProducerClient
- (id) initWithLogProducerConfig:(LogProducerConfig *)logProducerConfig
{
return [self initWithLogProducerConfig:logProducerConfig callback:nil];
}
- (id) initWithLogProducerConfig:(LogProducerConfig *)logProducerConfig callback:(on_log_producer_send_done_function)callback
{
return [self initWithLogProducerConfig:logProducerConfig callback:callback userparams:NULL];
}
- (id) initWithLogProducerConfig:(LogProducerConfig *)logProducerConfig callback:(on_log_producer_send_done_function)callback userparams: (NSObject *)params
{
if (self = [super init])
{
self->config = logProducerConfig->config;
self->producer = create_log_producer(logProducerConfig->config, *callback, (nil == params ? nil : (__bridge void *)(params)));
self->client = get_log_producer_client(self->producer, nil);
NSString *endpoint = [logProducerConfig getEndpoint];
NSString *project = [logProducerConfig getProject];
if ([endpoint length] != 0 && [project length] != 0) {
[TimeUtils startUpdateServerTime:endpoint project:project];
}
enable = YES;
}
return self;
}
- (void)DestroyLogProducer
{
if (!enable) {
return;
}
enable = NO;
destroy_log_producer(self->producer);
CFRelease(self->config->user_params);
}
- (LogProducerResult)AddLog:(Log *) log
{
return [self AddLog:log flush:0];
}
- (LogProducerResult)AddLog:(Log *) log flush:(int) flush
{
if (!enable || self->client == NULL || log == nil) {
return LogProducerInvalid;
}
NSMutableDictionary *logContents = [log getContent];
int pairCount = (int)[logContents count];
char **keyArray = (char **)malloc(sizeof(char *)*(pairCount));
char **valueArray = (char **)malloc(sizeof(char *)*(pairCount));
int32_t *keyCountArray = (int32_t*)malloc(sizeof(int32_t)*(pairCount));
int32_t *valueCountArray = (int32_t*)malloc(sizeof(int32_t)*(pairCount));
int ids = 0;
for (NSString *key in logContents) {
NSString *string = nil;
id value = logContents[key];
if ([value isKindOfClass:[NSNumber class]]) {
string = [value stringValue];
} else if ([value isKindOfClass: [NSString class]]){
string = value;
} else {
continue;
}
char* keyChar=[self convertToChar:key];
char* valueChar=[self convertToChar:string];
keyArray[ids] = keyChar;
valueArray[ids] = valueChar;
keyCountArray[ids] = (int32_t)strlen(keyChar);
valueCountArray[ids] = (int32_t)strlen(valueChar);
ids = ids + 1;
}
log_producer_result res = log_producer_client_add_log_with_len_time_int32(self->client, [log getTime], pairCount, keyArray, keyCountArray, valueArray, valueCountArray, flush);
for(int i=0;i<pairCount;i++) {
free(keyArray[i]);
free(valueArray[i]);
}
free(keyArray);
free(valueArray);
free(keyCountArray);
free(valueCountArray);
return res;
}
-(char*)convertToChar:(NSString*)strtemp
{
// NSUInteger len = [strtemp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1;
// if (len > 1000000) return strdup([strtemp UTF8String]);
// char cStr [len];
// [strtemp getCString:cStr maxLength:len encoding:NSUTF8StringEncoding];
// return strdup(cStr);
NSUInteger len = [strtemp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1;
// the limit on stack size will cause crash
// https://github.com/CocoaLumberjack/CocoaLumberjack/issues/38
char* cStr = malloc(sizeof(char) * len);
[strtemp getCString:cStr maxLength:len encoding:NSUTF8StringEncoding];
return cStr;
}
@end