Swift:日志打印库

4,908 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文同时参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

前言

之前做过的一个老项目,做了一次安全性检查,发现在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

image.png

这个日志库非常的古老,一个tag的1.0版本可以追溯到2011年,我想大多数人在那会都还没开始iOS开发。

这个日志库提供的功能也非常的多,日志等级、定制化输出格式、log写入到文件等等,功能应有尽有,虽然库的主体是用OC编写的,不过已经对Swift做了支持,而且非常友好。

大家有兴趣的话,可以看看它从OC到Swift的这层封装,可以对自己写代码也启发。

XCGLogger

image.png

这个库是用Swift编写的日志库,感觉有点像CocoaLumberjack的Swift版本。

不知道是功能满足了,还是其他的什么原因,这个库最近的一次更新在2年前。

SwiftPrettyPrint

image.png

和上面两个库在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
// )

它不仅可以一般打印,设置断点,也可以通过这个库进行打印,这样对于一些问题的调试也可以看得更加明朗。

参考文档

CocoaLumberjack

CocoaLumberJack日志库集成

XCGLogger

SwiftPrettyPrint

总结

我个人建议涉及日志打印库,应该在项目开始之初就确定好,这样避免了后期进行替换与修改,这种事情虽然干起来没有难度,但是非常机械。

另外可以考虑在自己的项目中封装一层,这样就算要替换日志库,只用在封装层进行改造即可。

萝卜青菜各有所爱,我所列举的日志打印库也不一定适合所以人使用,大家根据自己App的实际情况选用或者自己封装都是可以的。

我们下期见。