美文网首页
OC获取系统日志

OC获取系统日志

作者: Stark_Dylan | 来源:发表于2016-03-04 13:52 被阅读826次
    1. 获取Log
    
    /*! @header
     * These routines provide an interface to the Apple System Log facility.
     * The API allows client applications to create flexible, structured messages
     * and send them to the syslogd server.  Messages received by the server are
     * saved in a data store, subject to input filtering constraints.
     * This API also permits clients to create queries and search the message
     * data store for matching messages.
     */
    
    
    
    #pragma mark - Log Message Fetching
    
    // Due to a mistake in asl.h, things get a little messy. We need to mark these symbols as weak since they won't exist on iOS 7 despite the compiler thinking otherwise.
    // asl.h in the iOS 8.1 SDK claims that asl_next() and asl_release() were introduced in iOS 7 to replace aslresponse_next() and aslresponse_free(). However, they were actually added in iOS 8.0.
    extern aslmsg asl_next(asl_object_t obj) __attribute__((weak_import));
    extern void asl_release(asl_object_t obj) __attribute__((weak_import));
    
    + (NSArray *)allLogMessagesForCurrentProcess
    {
        asl_object_t query = asl_new(ASL_TYPE_QUERY);
    
        // Filter for messages from the current process. Note that this appears to happen by default on device, but is required in the simulator.
        NSString *pidString = [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]];
        asl_set_query(query, ASL_KEY_PID, [pidString UTF8String], ASL_QUERY_OP_EQUAL);
    
        aslresponse response = asl_search(NULL, query);
        aslmsg aslMessage = NULL;
    
        NSMutableArray *logMessages = [NSMutableArray array];
    
        if (&asl_next != NULL && &asl_release != NULL) {
            while ((aslMessage = asl_next(response))) {
                [logMessages addObject:[SystemLogMessage logMessageFromASLMessage:aslMessage]];
            }
            asl_release(response);
        } else {
            // Mute incorrect deprecated warnings. We'll need the "deprecated" functions on iOS 7, where their replacements don't yet exist.
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
            while ((aslMessage = aslresponse_next(response))) {
                [logMessages addObject:[SystemLogMessage logMessageFromASLMessage:aslMessage]];
            }
            aslresponse_free(response);
    #pragma clang diagnostic pop
        }
    
        return logMessages;
    }
    
    

    在上边用到了logMessageFromASLMessage:这样的一个目录

    这个类的原型是

    #import <asl.h>
    
    @interface SystemLogMessage : NSObject
    
    + (instancetype)logMessageFromASLMessage:(aslmsg)aslMessage;
    
    @property (nonatomic, strong) NSDate *date;
    @property (nonatomic, copy) NSString *sender;
    @property (nonatomic, copy) NSString *messageText;
    @property (nonatomic, assign) long long messageID;
    
    @end
    
    
    #import "SystemLogMessage.h"
    
    @implementation SystemLogMessage
    
    +(instancetype)logMessageFromASLMessage:(aslmsg)aslMessage
    {
        SystemLogMessage *logMessage = [[SystemLogMessage alloc] init];
    
        const char *timestamp = asl_get(aslMessage, ASL_KEY_TIME);
        if (timestamp) {
            NSTimeInterval timeInterval = [@(timestamp) integerValue];
            const char *nanoseconds = asl_get(aslMessage, ASL_KEY_TIME_NSEC);
            if (nanoseconds) {
                timeInterval += [@(nanoseconds) doubleValue] / NSEC_PER_SEC;
            }
            logMessage.date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
        }
    
        const char *sender = asl_get(aslMessage, ASL_KEY_SENDER);
        if (sender) {
            logMessage.sender = @(sender);
        }
    
        const char *messageText = asl_get(aslMessage, ASL_KEY_MSG);
        if (messageText) {
            logMessage.messageText = @(messageText);
        }
    
        const char *messageID = asl_get(aslMessage, ASL_KEY_MSG_ID);
        if (messageID) {
            logMessage.messageID = [@(messageID) longLongValue];
        }
    
        return logMessage;
    }
    
    - (BOOL)isEqual:(id)object
    {
        return [object isKindOfClass:[SystemLogMessage class]] && self.messageID == [object messageID];
    }
    
    - (NSUInteger)hash
    {
        return (NSUInteger)self.messageID;
    }
    
    @end
    

    以上部分的参考内容:

    1. FLEX框架下的FLEXSystemLogMessage类
      Git地址

    查看过的一些代码

    1. MWLogging
      Git地址
    2. LibComponentLogging
      Git地址

    相关文章

      网友评论

          本文标题:OC获取系统日志

          本文链接:https://www.haomeiwen.com/subject/ddyokttx.html