注:本文是重定向日志输出到项目的其他模块,非重定向直接输出到文件。

在项目开发的时候,碰到一个很纠结的问题:因本人做的是iOS SDK层,同事做的是App层,因分工不同,在调试和修复Bug的时候需要提供明确清晰的日志。若把项目中的全部日志都输出到一个文件中,查找杂乱而繁琐,而我也只需要SDK层的日志,因此日志重定向到文件在此已不再合适(使用freopen重定向stdout、stderr输出路径即可,网上教程较多)。

因此个人根据需求分析之后,定义了2个宏:CLog、CPrintf(也可重写系统的NSLog,printf接口,在此为了不混淆系统接口和功能,自己重新定义了2个宏),再单独封装了一个单例类ZJLogSDK,提供一个代理回调给App层进行显示或保存。

#define CLog(...) [[ZJLogSDK sharedTool] sendLogStr:[NSString stringWithFormat:__VA_ARGS__]]
#define CPrintf(...)  \
{\char cLogBuf[1024] = {0}; /*只支持1024个字节的输出(可自行调节大小)*/\snprintf((char *)cLogBuf, sizeof(cLogBuf), __VA_ARGS__); /*将格式字符串和可变参数列表保存到cLogBuf中*/\CPrintfCallback(cLogBuf); /*此函数定义在只包含c变量和接口的头文件中,实现在m文件中,从而进行oc接口的调用*/\
};

大致思路如下,具体代码可下载下文中的Demo查看:

CLog:实现相对比较简单,只要把输出格式字符串和可变参数列表用NSString再进行格式化为字符串即可。

CPrintf:需要先使用snprintf将格式字符串和可变参数列表进行字符串拼接操作,之后再通过连接到单例ZJLogSDK中进行输出或打印。

我写了一个简单的Demo,有兴趣可以看下,文件功能内容如下:

ZJLogSDK(h、mm):主体部分,包括代理设置、日志总开关、日志上报开关,在此用mm后缀可兼容m、mm(C++类)两种OC文件使用CLog,若使用m后缀则在mm文件中无法使用;

ZJLogSDKExt(h):即ZJLogSDK类的扩展,主要是实现单例和封装外部不可访问的接口和变量(若不需要单独封装,可将内容合并到ZJLogSDK.h中);

ZJLogPrintf(h):CPrintf宏的定义窗口,主要是为C文件使用CPrintf做接口;

ZJLogBridgeC(h、m):此唯一目的就是桥接C和OC之间的接口,调用路径为CPrintf->CPrintfCallback->ZJLogSDK。

iOS重定向输出打印(NSLog、printf)相关推荐

  1. ios nslog 例子_IOS 打印 NSlog 使用

    NSLog的定义 void NSLog(NSString *format, -); 基本上,NSLog很像printf,同样会在console中输出显示结果.不同的是,传递进去的格式化字符是NSStr ...

  2. php 输出方法,PHP输出打印方法

    PHP输出打印方法 1. echo()输出字符串,PHP允许我们在双引号串中直接包含字串变量,而单引号串中的内容总被认为是普通字符. 2. mixed print_r ( mixed $express ...

  3. php变量原格式输出,PHP格式化输出打印变量

    PHP 常用的输入变量函数print_r,但是输出没有换行,看起来很费力 我们可以自定义一个函数来实现变量的格式化输出,代码如下: function dump($vars, $label = '', ...

  4. 格式化输出的函数printf()用法

    功能:格式化输出函数, 一般用于向标准输出设备按规定格式输出信息. 调用格式为:printf("格式化字符串", 参量表); 格式化字符串包括两部分内容: 一部分是正常字符, 这些 ...

  5. 【linux笔记】vi和vim编辑器,重定向输出,系统命令,进程,管道

    vi/vim 在linux下一般使用vi编辑器来编辑文件 Vi既可以查看文件也可以编辑文件. 三种模式: 命令行.插入.底行模式 切换到命令行模式:ESC键 切换到插入模式:按i,o,a键 切换到底行 ...

  6. python 将输出打印到文件

    python 将输出打印到文件 import os import sys temp = sys.stdout f = open('test.txt','w') print('1111111111') ...

  7. 2021.07.11 【ABAP随笔】采购订单Message输出打印

    Title 采购订单Message输出打印 很多业务中需要在完成订单的时候来进行单据打印的输出操作,比如新建采购订单的时候,需要输出采购订单的PDF或者使用邮件功能来将采购订单发送给制定人员 SAP ...

  8. python一行输出多个数据_如何在Python中让两个print()函数的输出打印在一行内?

    1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数sep和end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用','代替空格,且默认末尾加 ...

  9. Linux重定向输出日志

    作者:翁松秀 Linux重定向输出日志 重定向类型 0:标准输入. 1:标准输出. 2:错误信息输出. 2>&1:将错误信息重定向到标准输出. 重定向格式 1,./spark-submi ...

最新文章

  1. java导出模板 pdf设置字体_有哪些相见恨晚的PPT模板网站?
  2. OpenCV | OpenCV中cvgoodFeaturesToTrack函数详细注释
  3. Python OS和shutil模块的常见方法
  4. hive - 自定义函数(超详细步骤,手把手的交)
  5. 华为再获90天“临时许可证” 可继续维护客户
  6. 计算机配件的真假辨伪,专家教你辨真伪 “火眼金睛”辨真假配件
  7. linux内核编译ccflag,Linux内核模块编译失败
  8. spring+mybatis通用dao层、service层的实现
  9. linux添加ipv6默认路由表,IPv6及静态路由配置
  10. 如何在Pages for Mac中添加页眉、页脚和页码?
  11. Java微服务系统项目技术栈总结
  12. Excel 快速填充序号
  13. kindle使用参考
  14. 解决Source Not Found问题
  15. 手机屏幕分辨率说明大全 VGA - hd
  16. 怎样开启SQL数据库服务
  17. 华硕电脑笔记本台式机预装专用系统 V2011
  18. 微信小程序:紫色特别舒服的UI趣味测试微信小程序
  19. 奖金711万!这位“山东宝妈”破解美国运算100万年才可能解开的密码!
  20. 《SQL必知必会》第六课 用通配符进行过滤 使用LIKE操作符,%、[]、_通配符进行通配搜索

热门文章

  1. Spring MVC注解、标签库、国际化
  2. 少女心满满的粉色笔记本们
  3. 量子密钥分发B92协议——笔记
  4. 最新版SIM卡管理工具MAGICSIM V25.0(新版多功能SIM卡读卡软件) 百度网盘下载地址
  5. 获取手机Gps地理位置并获取Gps信号强弱
  6. 南京邮电大学Web技术双语实验二(Web服务端脚本编写)
  7. Android app快速集成Mob shareSDK分享到微信和QQ
  8. 阿里品牌数据银行分析师复习资料库——人群圈选类问题答案
  9. POJ2186 Popular Cows【Tarjan】【强连通分量】
  10. mysql命令行 进入库_MySQL命令行操作数据库