怎么在iOS中控制NSLog输出时机

2023-04-11 186189 编程技术

今天就跟大家聊聊有关怎么在iOS中控制NSLog输出时机,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

-(void)saveDEBUGlog{
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentDirectory = [paths objectAtIndex:0];
  
  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  [dateFormatter setDateFormat:@"yyyy_MM_dd_HH_mm_ss"];
  NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
  NSString *fileName = [NSString stringWithFormat:@"testLog_%@.log",currentDateStr];
  
  NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
  // 先删除已经存在的文件
  NSFileManager *defaultManager = [NSFileManager defaultManager];
  [defaultManager removeItemAtPath:logFilePath error:nil];
  
  // 将log输入到文件
  freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
  freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}

这个方法主要是调用 freopen 这个方法来写入, 其中 stdout 和 stderr 囊括了 iOS 大部分的异常输出。

2. 根据 Bool 值控制 log 输出

用户在使用 app 遇到各种各样的问题,当自己以及测试团队不好定位原因的时候,能将用户把关键点的 log 发送过来是最好的分析方法了。但是如何将 app 运行过程中的 log 截取一部分保存呢?像开关一样能够控制 log 的读写呢?通过阅读 MQTTLog 源码发现获得的灵感。

首先对 NSLog 进行下宏替换,项目中统一使用 SLOG 来进行输出

#define SLOG(fmt, ...) if (reportLoggerIsOpen) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
从宏定义可以看出,reportLoggerIsOpen 是控制 Log 输出的开关,对于reportLoggerIsOpen的定义,在 h 文件中先 extern 声明这个变量,然后再 m 文件中去实现。

.h 文件

#import <Foundation/Foundation.h>

extern BOOL reportLoggerIsOpen;
.m 文件
BOOL reportLoggerIsOpen = NO;

+ (void)setLogOpen:(BOOL)open {
  reportLoggerIsOpen = open;
}

通过 setLogOpen 这个方法,就能够收放自如的控制日志写入了。比如你需要抓取登录模块的日志,那么就在登录前传入 true,登录完毕后,传入 false,即可只保留登录模块的日志了。

看完上述内容,你们对怎么在iOS中控制NSLog输出时机有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注本站行业资讯频道,感谢大家的支持。

Springboot下使用Redis管道(pipeline)进行批量操作的介绍

今天小编给大家分享的是Springboot下使用Redis管道(pipeline)进行批量操作的介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。前言之前有业务场景需要批量插入数据到Redis中,做的过程中也有一些感悟,因此记录下来,以防忘记。下面的内容会涉及到分别使用for、管道处理批量操作,比较其所花费时间。分别使用RedisCallb...

关于C++和OpenMP的介绍

今天小编给大家分享的是关于C++和OpenMP的介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。一、背景知识1、program作用#pragma是C和C++语言中的一个预处理指令。它主要用于向编译器发送特定的信息或者指示,以便控制编译过程。#pragma通常与编译器特定的选项或功能一起使用,因此它的具体行为和实现可能因不同的编译器而有所不...

C语言结构体指针具体怎么使用

本篇文章和大家了解一下C语言结构体指针具体怎么使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。在C语言中,结构体指针是一种非常有用的数据类型,它可以让我们更方便地操作结构体。结构体指针可以指向结构体的实例,从而允许我们访问结构体中的成员变量,并对这些成员变量进行赋值、修改、删除等操作。本文将介绍C语言中结构体指针的基础概念和使用方法,并提供一些示例代码来帮助读者更好地理解。什...

JavaScript作用域从局部到全局介绍

本篇文章和大家了解一下JavaScript作用域从局部到全局介绍。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。JavaScript作用域深度剖析:从局部到全局一网打尽1.1编译原理JavaScript 事实上是一门编译语言。在传统编译语言中,一段源代码执行前会经历三个步骤:分词/词法分析(Tokenizing/Lexing)var a =&nbsp...

C#中如何限制TextBox控件内输入值的范围

这篇文章主要介绍了C#中如何限制TextBox控件内输入值的范围,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#限制TextBox控件内输入值的范围举个例子C#TextBox控件限制只允许输入数字及小数点处理只输入数字的C#文本框只能输入数字和退格键总结C#限制TextBox控件内输入值的范围 举个例子 比如要限制TextBox1控件内只能输入1~100的...

C#如何让winform程序中的输入文本框保留上次的输入

这篇文章主要介绍了C#如何让winform程序中的输入文本框保留上次的输入问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#让winform程序中的输入文本框保留上次的输入C#TextBox控件,回车键实现点击按钮即自动登录摘要总结C#让winform程序中的输入文本框保留上次的输入 选中TextBox控件,在属性窗格中找到(ApplicationSet...

C# 获取XML文件内容的多种方式总结

这篇文章主要介绍了C# 获取XML文件内容的多种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#获取XML文件内容的方式一、读取外部的XML文件方法二、读取内部XML文件方法三、读取类库中XML文件的方法四、读取程序内添加的外部可见的XML文件总结C#获取XML文件内容的方式 首先设定有一个xml文件Configs.xml,其内容如下: ...

C# Path类---文件路径解读

这篇文章主要介绍了C# Path类---文件路径,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录C#Path类—文件路径C#文件路径Path类测试总结C#Path类—文件路径 给定如下字符串类型filePath,表示一个文件路径: stringfilePath="D:\\Program\\Test\\Config.txt"; ...