如何在ios中使用ASL获取控制台日志?

如何在ios中使用ASL获取控制台日志?,ios,iphone,nslog,Ios,Iphone,Nslog,我想使用ASL获取控制台日志。我已经编写了以下代码,并且在iPhone模拟器中获得了所有控制台日志,但当我使用iPhone 4.1和iPad时,我从一开始就得到的控制台就更少了。我试了很多 - (NSMutableArray *)getAppLogByApp:(NSString *)appName { NSMutableArray *lObjAppLogsPtr = (NSMutableArray *)nil; LogInfo *lObjLogInfoP

我想使用ASL获取控制台日志。我已经编写了以下代码,并且在iPhone模拟器中获得了所有控制台日志,但当我使用iPhone 4.1和iPad时,我从一开始就得到的控制台就更少了。我试了很多

- (NSMutableArray *)getAppLogByApp:(NSString *)appName
{
    NSMutableArray      *lObjAppLogsPtr = (NSMutableArray *)nil;
    LogInfo         *lObjLogInfoPtr = (LogInfo *)nil;

    aslmsg q, m;
    int i;
    const char *key, *val, *lAppName;
    NSDateFormatter *lObjDateFormatter = [[NSDateFormatter alloc] init];
    [lObjDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];


    q = asl_new(ASL_TYPE_QUERY);

    //also set the log level to fetch if is set to the global variable m_cObjLogMessageLevel
    const char* lObjASLLogLevel = [[NSString stringWithFormat:@"%d", m_cLogMessageLevel] UTF8String];
    asl_set_query(q, ASL_KEY_LEVEL, lObjASLLogLevel, ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC);
    //asl_set_query(q, ASL_KEY_LEVEL, lObjASLLogLevel, ASL_QUERY_OP_EQUAL | ASL_QUERY_OP_NUMERIC);
    //if appName passed to it then fetch the logs for this application only
    if ((NSString *)nil != appName && 0 < appName.length)
    {
        lAppName = [appName UTF8String];
        asl_set_query(q, ASL_KEY_SENDER, lAppName, ASL_QUERY_OP_EQUAL);
    }

    aslresponse r = asl_search(NULL, q);

    while (NULL != (m = aslresponse_next(r)))
    {
        if ((NSMutableArray *)nil == lObjAppLogsPtr)
        {
            lObjAppLogsPtr = [[NSMutableArray alloc] init];
        }

        for (i = 0; (NULL != (key = asl_key(m, i))); i++)
        {
            NSString *keyString = [NSString stringWithUTF8String:(char *)key];

            val = asl_get(m, key);

            NSString *lObjValString = nil;
            if (nil != val)
            {
                lObjValString = [NSString stringWithUTF8String:val];
            }
            else
            {
                //NSLog(@"Val in nil");
                lObjValString = @"";
            }

            if ((LogInfo *)nil == lObjLogInfoPtr)
            {
                lObjLogInfoPtr = [[LogInfo alloc] init];
            }


            if(YES == [keyString isEqualToString:@"Level"])
            {
                lObjLogInfoPtr.m_cObjLevel = lObjValString;
            }
            else if(YES == [keyString isEqualToString:@"Time"])
            {
                //convert the time to YYYY-MM-DD HH:MM:SS format
                time_t time = strtol(val, NULL, 0);

                NSDate *lObjDatePtr = [[NSDate dateWithTimeIntervalSince1970:time] copy];
                NSString *lObjDateStringPtr = [lObjDateFormatter stringFromDate:lObjDatePtr];
                lObjLogInfoPtr.m_cObjTime = lObjDateStringPtr;
            }
            else if(YES == [keyString isEqualToString:@"Sender"])
            {
                lObjLogInfoPtr.m_cObjSender = lObjValString;
            }
            else if(YES == [keyString isEqualToString:@"Message"])
            {
                lObjLogInfoPtr.m_cObjMessage = lObjValString;
            }
        }

        //Add the loginfo array
        [lObjAppLogsPtr addObject:lObjLogInfoPtr];
        //Release the loginfo and set it to nil for further use
         [lObjLogInfoPtr release];
        lObjLogInfoPtr = (LogInfo *)nil;
    }

    if (NULL != r)
    {
        aslresponse_free(r);
    }

    //free the als msg object
    asl_free(q);
    [lObjDateFormatter release];


    return lObjAppLogsPtr;
}
-(NSMutableArray*)getAppLogByApp:(NSString*)appName
{
NSMUTABLEARRY*lObjAppLogsPtr=(NSMUTABLEARRY*)无;
LogInfo*lObjLogInfoPtr=(LogInfo*)无;
aslmsg q,m;
int i;
常量字符*key、*val、*lAppName;
NSDateFormatter*lObjDateFormatter=[[NSDateFormatter alloc]init];
[lObjDateFormatter setDateFormat:@“yyyy-MM-dd HH:MM:ss”];
q=asl_新建(asl_类型查询);
//如果设置为全局变量m_cObjLogMessageLevel,还将日志级别设置为fetch
const char*lObjASLLogLevel=[[NSString stringWithFormat:@“%d”,m_cLogMessageLevel]UTF8String];
asl_集合_查询(q、asl_键_级别、lObjASLLogLevel、asl_查询_操作_LESS_EQUAL、asl_查询_操作_NUMERIC);
//asl_集合_查询(q、asl_键_级别、lObjASLLogLevel、asl_查询_OP_EQUAL、asl_查询_OP_NUMERIC);
//如果将appName传递给它,则仅获取此应用程序的日志
if((NSString*)nil!=appName&&0
这里的
LogIngo
NSObject
的一个子类。 请帮帮我。我已经试了一周了。

Mac上的行为(因此在iOS模拟器中)是不同的;在Mac上,默认情况下,进程可以读取其他进程创建的日志条目。在iOS设备上,ASL将仅返回由您的进程创建的日志条目,并且仅当您将
ASL\u KEY\u READ\u UID
显式设置为“
-1
”时才会返回

此外,在设备上对日志进行了相当大的删减,可能只包括应用程序当前运行时生成的条目。(如果您希望将日志条目持久化,并且正在使用Swift,则可能需要研究一个更健壮的日志记录包,例如。)

如果您使用的是Swift,那么有一个名为的新开源项目,它提供了一个类型安全API,用于读取和写入苹果系统日志条目。使用CleanroomASL,搜索ASL日志条目如下所示:

let client = ASLClient()
let query = ASLQueryObject()

client.search(query) { record in
    if let record = record {
        // we've gotten a log entry for the search.
        // 'record' is of type ASLQueryObject.ResultRecord
    }
    else {
        // there are no more log entries to process
    }
    // return true while we still want to get results
    // or return false when we don't want to process more
    return true
}
您可以通过设置其他查询键来约束搜索查询:

query.setQueryKey(.Message, value: nil, operation: .KeyExists, modifiers: .None)
query.setQueryKey(.Time, value: Int(NSDate().timeIntervalSince1970 - (60 * 60)), operation: .GreaterThanOrEqualTo, modifiers: .None)
上面的代码将返回过去5分钟内记录的所有ASL日志条目,这些条目也具有
.Message
属性的值。

Mac上(因此在iOS模拟器中)的行为是不同的;在Mac上,默认情况下,进程可以读取其他进程创建的日志条目。在iOS设备上,ASL将仅返回由您的进程创建的日志条目,并且仅当您将
ASL\u KEY\u READ\u UID
显式设置为“
-1
”时才会返回

此外,在设备上对日志进行了相当大的删减,可能只包括应用程序当前运行时生成的条目。(如果您希望将日志条目持久化,并且正在使用Swift,则可能需要研究一个更健壮的日志记录包,例如。)

如果您使用的是Swift,那么有一个名为的新开源项目,它提供了一个类型安全API,用于读取和写入苹果系统日志条目。使用CleanroomASL,搜索ASL日志条目如下所示:

let client = ASLClient()
let query = ASLQueryObject()

client.search(query) { record in
    if let record = record {
        // we've gotten a log entry for the search.
        // 'record' is of type ASLQueryObject.ResultRecord
    }
    else {
        // there are no more log entries to process
    }
    // return true while we still want to get results
    // or return false when we don't want to process more
    return true
}
您可以通过设置其他查询键来约束搜索查询:

query.setQueryKey(.Message, value: nil, operation: .KeyExists, modifiers: .None)
query.setQueryKey(.Time, value: Int(NSDate().timeIntervalSince1970 - (60 * 60)), operation: .GreaterThanOrEqualTo, modifiers: .None)

上述代码将返回过去5分钟内记录的所有ASL日志条目,这些条目也具有
.Message
属性的值。

ASL的意思是什么?是框架吗?@guarav:ASL是指苹果系统日志,它提供所有控制台日志,如error、warnigs.。有关更多详细信息,请参阅此ASL.h file.ASL的意思?是框架吗?@guarav:ASL是指苹果系统日志,提供所有控制台日志,如错误、警告