ReadViewSDK/ReadViewDemo/Pods/DTFoundation/Core/Source/DTLog.m
2026-05-21 19:40:51 +08:00

137 lines
3.0 KiB
Objective-C

//
// DTLog.m
// DTFoundation
//
// Created by Oliver Drobnik on 06.08.13.
// Copyright (c) 2013 Cocoanetics. All rights reserved.
//
#import "DTLog.h"
#import <asl.h>
#import <Availability.h>
DTLogLevel DTCurrentLogLevel = DTLogLevelInfo;
#if TARGET_OS_IPHONE
#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_1 && __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
#define DTLOG_USE_NEW_ASL_METHODS 1
#endif
#else
#if __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_9
#define DTLOG_USE_NEW_ASL_METHODS 1
#endif
#endif
#if DEBUG
// set default handler for debug mode
DTLogBlock DTLogHandler = ^(NSUInteger logLevel, NSString *fileName, NSUInteger lineNumber, NSString *methodName, NSString *format, ...)
{
va_list args;
va_start(args, format);
DTLogMessagev(logLevel, format, args);
va_end(args);
};
#else
// set no default handler for non-DEBUG mode
DTLogBlock DTLogHandler = NULL;
#endif
#pragma mark - Logging Functions
void DTLogSetLoggerBlock(DTLogBlock handler)
{
DTLogHandler = [handler copy];
}
void DTLogSetLogLevel(DTLogLevel logLevel)
{
DTCurrentLogLevel = logLevel;
}
void DTLogMessagev(DTLogLevel logLevel, NSString *format, va_list args)
{
NSString *facility = [[NSBundle mainBundle] bundleIdentifier];
aslclient client = asl_open(NULL, [facility UTF8String], ASL_OPT_STDERR); // also log to stderr
aslmsg msg = asl_new(ASL_TYPE_MSG);
asl_set(msg, ASL_KEY_READ_UID, "-1"); // without this the message cannot be found by asl_search
// convert to via NSString, since printf does not know %@
NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
asl_log(client, msg, (int)logLevel, "%s", [message UTF8String]);
asl_free(msg);
va_end(args);
}
void DTLogMessage(DTLogLevel logLevel, NSString *format, ...)
{
va_list args;
va_start(args, format);
DTLogMessagev(logLevel, format, args);
va_end(args);
}
NSArray *DTLogGetMessages(void)
{
aslmsg query, message;
int index;
const char *key, *val;
NSString *facility = [[NSBundle mainBundle] bundleIdentifier];
query = asl_new(ASL_TYPE_QUERY);
// search only for current app messages
asl_set_query(query, ASL_KEY_FACILITY, [facility UTF8String], ASL_QUERY_OP_EQUAL);
aslresponse response = asl_search(NULL, query);
NSMutableArray *tmpArray = [NSMutableArray array];
#if DTLOG_USE_NEW_ASL_METHODS
while ((message = asl_next(response)))
#else
while ((message = aslresponse_next(response)))
#endif
{
NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary];
for (index = 0; ((key = asl_key(message, index))); index++)
{
NSString *keyString = [NSString stringWithUTF8String:(char *)key];
val = asl_get(message, key);
NSString *string = val?[NSString stringWithUTF8String:val]:@"";
tmpDict[keyString] = string;
}
[tmpArray addObject:tmpDict];
}
asl_free(query);
#if DTLOG_USE_NEW_ASL_METHODS
asl_release(response);
#else
aslresponse_free(response);
#endif
if ([tmpArray count])
{
return [tmpArray copy];
}
return nil;
}