iOS中打印系统详细日志

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中打印系统详细日志相关的知识,希望对你有一定的参考价值。

Q:如何打印当前的函数和行号?

 

A:我们可以在打印时使用一些预编译宏作为打印参数,来打印当前的函数和行号。如:

 

1

NSLog(@"%s:%d obj=%@", __func__, __LINE__, obj);

其中__func__和__LINE__都是预编译的宏,编译时会分别替换为当前函数和当前行号。

下面是一些常用于打印日志的宏。

 

说明

__func__ 打印当前函数或方法,c字符串

__LINE__ 打印当前行号,整数

__FILE__ 打印当前文件路径,c字符串

__PRETTY_FUNCTION__ 打印当前函数或方法(在C++中会包含参数类型),c字符串

Q:如何打印一个类名,消息名,当前堆栈信息?

 

A:你可以使用以下方法在运行时动态获取这些信息。

 

代码 说明

NSStringFromSelector(SEL) 获取selector的名字

NSStringFromSelector(_cmd) 获取当前方法名

NSStringFromClass([object class])获取object的类名

NSStringFromClass([AppDelegate class]));

 

NSThread callStackSymbols] 获取当前线程的栈,是一个NSArry,包含堆栈中所有函数名。

Q:如何将日志打印到一个文件

 

A:可以使用freopen函数重定向标准输出和标准出错文件。因为printf函数会向标准输出(stdout)打印,而NSLog函数会向标准出错(stderr)打印。重新定向标准输出(stdout)和标准出错(stderr)到一个文件将会使他们打印日志到一个文件中。

 

1

2

freopen("/tmp/log.txt", "a+", stdout);

freopen("/tmp/log.txt", "a+", stderr);

#define NSLog(FORMAT, ...) {\

 

                            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];\

 

                            [dateFormatter setDateStyle:NSDateFormatterMediumStyle];\

 

                            [dateFormatter setTimeStyle:NSDateFormatterShortStyle];\

 

                            [dateFormatter setDateFormat:@"HH:mm:ss:SSSSSS"]; \

 

                            NSString *str = [dateFormatter stringFromDate:[NSDate date]];\

 

                            [dateFormatter release];\

 

                            fprintf(stderr,"[--%s--]*[--%s--]*[--%s:%d--]\n",[str UTF8String], [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String],[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__);\

 

                            }

以上是关于iOS中打印系统详细日志的主要内容,如果未能解决你的问题,请参考以下文章

argparse 代码片段只打印部分日志

iOS xcode8 运行去掉系统打印的日志

iOS-创建自己的日志系统

Linux系统启动过程的打印信息从何而来?

webstorm代码片段的创建

一文详细了解logback之日志打印FileAppender