小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文同时参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
前言
之前做过的一个老项目,做了一次安全性检查,发现在Release模式下面,App在打印日志。而这种在Release模式下,需要取消日志打印。
查看了一下项目,OC的代码,用了很多NSLog去打印日志:
NSLog(@"点击了确定");
NSLog固然好用,不过我们需要改造一下。
使用宏一步到位
直接通过定义宏,区分Debug和Release模式,可以完全保证在Release模式下面,一行打印日志都不留,这算得上最暴力、最简单、改动量最小的方式了:
/// 消除文件中的NSLog函数
#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...)
#endif
在Release模式下,宏NSLog(...)没有任何的实现,所以就不可能会有任何数据留下。
这确实是一个好的办法,而且省事省力,入侵性小。不过当我们对打印的日志有一定需求的时候,应该怎么办呢?
但是这种方式也仅仅针对OC,大伙可以试试在Swift中使用同种思路,这种写法达不到理想效果,大家可以试试。
/// 这种写法达不到理想效果
public func swiftPrint(_ items: Any..., separator: String = " ", terminator: String = "\n") {
#if DEBUG
print(items, separator: separator, terminator: terminator)
#endif
}
如果有打印的需求,建议还是使用库比较好。
CocoaLumberjack
这个日志库非常的古老,一个tag的1.0版本可以追溯到2011年,我想大多数人在那会都还没开始iOS开发。
这个日志库提供的功能也非常的多,日志等级、定制化输出格式、log写入到文件等等,功能应有尽有,虽然库的主体是用OC编写的,不过已经对Swift做了支持,而且非常友好。
大家有兴趣的话,可以看看它从OC到Swift的这层封装,可以对自己写代码也启发。
XCGLogger
这个库是用Swift编写的日志库,感觉有点像CocoaLumberjack的Swift版本。
不知道是功能满足了,还是其他的什么原因,这个库最近的一次更新在2年前。
SwiftPrettyPrint
和上面两个库在GitHub的star相比,它只有100多个star,确实比较少,但是我尝试用了一下,感觉还是不错的。
定义:
enum Enum {
case foo(Int)
}
struct ID {
let id: Int
}
struct Struct {
var array: [Int?]
var dictionary: [String: Int]
var tuple: (Int, string: String)
var `enum`: Enum
var id: ID
}
let value = Struct(array: [1, 2, nil],
dictionary: ["one": 1, "two": 2],
tuple: (1, string: "string"),
enum: .foo(42),
id: ID(id: 7))
打印:
Pretty.print(value)
// Struct(array: [1, 2, nil], dictionary: ["one": 1, "two": 2], tuple: (1, string: "string"), enum: .foo(42), id: 7)
Pretty.prettyPrint(value)
// Struct(
// array: [
// 1,
// 2,
// nil
// ],
// dictionary: [
// "one": 1,
// "two": 2
// ],
// tuple: (
// 1,
// string: "string"
// ),
// enum: .foo(42),
// id: 7
// )
它不仅可以一般打印,设置断点,也可以通过这个库进行打印,这样对于一些问题的调试也可以看得更加明朗。
参考文档
总结
我个人建议涉及日志打印库,应该在项目开始之初就确定好,这样避免了后期进行替换与修改,这种事情虽然干起来没有难度,但是非常机械。
另外可以考虑在自己的项目中封装一层,这样就算要替换日志库,只用在封装层进行改造即可。
萝卜青菜各有所爱,我所列举的日志打印库也不一定适合所以人使用,大家根据自己App的实际情况选用或者自己封装都是可以的。
我们下期见。