如果你用过 NodeJS 、 Python 之类的写后台,那你一定会知道一个愉快的输出窗口是多么的重要。今天跟我一起来配置一个愉快的 Swift 输出窗口吧。

Demo 地址:SwiftDebug

我们需要:


安装

我们先来配置基本的需求:

添加 XCGLogger

在你的项目中添加 Pod:

1
pod 'XCGLogger', '~> 3.2'

安装 XcodeColors

下载文件 XcodeColors

打开 XcodeColors.xcodeproj 运行一下~

安装 KZLinkedConsole

直接使用 Alcatraz 搜索 KZLinkedConsole 安装即可。


配置一个好的输出窗口

新建一个 Logger.swift,当然名字随你喜欢了~:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public let log: XCGLogger = {
let log = XCGLogger.defaultInstance()
let logPath : NSURL = cacheDirectory.URLByAppendingPathComponent("XCGLogger.Log")
// By using Swift build flags, different log levels can be used in debugging versus staging/production. Go to Build settings -> Swift Compiler - Custom Flags -> Other Swift Flags and add -DDEBUG to the Debug entry.
#if DEBUG
log.setup(.Debug, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil)
#else
log.setup(.Severe, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: nil)
#endif
log.xcodeColorsEnabled = true
log.xcodeColors = [
.Verbose: .lightGrey,
.Debug: .darkGrey,
.Info: .darkGreen,
.Warning: .orange,
.Error: .red,
.Severe: .whiteOnRed
]
return log
}()

private var documentsDirectory: NSURL {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.endIndex-1]
}

private var cacheDirectory: NSURL {
let urls = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask)
return urls[urls.endIndex-1]
}

这部分的代码是参考别人的配置,具体在哪里忘记了,如果有人知道请告诉我~

XCGLogger 的等级从高到地分别是:

  • Verbose
  • Debug
  • Info
  • Warning
  • Error
  • Severe
  • None

当你设置了一个低等级的日志等级,高等级的就不会有输出了~

1
2
3
4
5
6
log.verbose("This is Verbose.")
log.debug("This is Debug.")
log.info("This is Info.")
log.warning("This is Warning.")
log.error("This is Error.")
log.severe("This is Servre.")

来试一试现在的效果吧~

效果还不错哦~,输出的顺序分别为时间、 log 等级、当前线程、代码文件和位置、当前函数名、输出信息。

还不够~不能满足当前需求~

我们经常会与服务器打交道~绿色 200 红色的 404 什么的岂不是爽飞了~

吐槽一下,整个 XCFLogger 写在一个文件看的我好慌。

再来写一个专门输出网络请求的吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public struct NetworkLog {
static let ESCAPE = "\u{001b}["

static let RESET_FG = ESCAPE + "fg;" // Clear any foreground color
static let RESET_BG = ESCAPE + "bg;" // Clear any background color
static let RESET = ESCAPE + ";" // Clear any foreground or background color

typealias StatusCode = Int
static func out(statusCode: StatusCode, target: (baseURL: NSURL, path: String, method: String, parameters: [String: AnyObject]?), json: AnyObject) {
var codeColor = "fg255,0,0"
if statusCode == 200 {
codeColor = "fg0,255,0"
}
print("\(ESCAPE)\(codeColor);\(statusCode)\(RESET) \(ESCAPE)fg53,255,206;\(target.method)\(RESET) \(ESCAPE)fg69,69,69;\(target.baseURL)\(target.path) \(target.parameters ?? [:])\(RESET) \n\(ESCAPE)fg29,29,29;\(json)\(RESET)")
}
}

在实际的项目中我用的 Moya,所以参数 target 的类型我写成了TargetType,具体还是看你这里是什么了~我采用 Moya 的原因除了在 API 中设计的很安全,其余就是因为兼容 Rx 和可以自由添加你需要的插件,所以我直接把这部分加到 Moya 插件上了。

试试效果:

1
2
NetworkLog.out(200, target: (baseURL: NSURL(string: "http://swift.gg")!, path: "/v5", method: "GET", parameters: ["article": 1]), json: ["title":"结构体中的 Lazy 属性探究", "author":"Ole Begemann", "translator":"pmst","content":"666666"])
NetworkLog.out(404, target: (baseURL: NSURL(string: "http://swift.gg")!, path: "/v5", method: "GET", parameters: ["article": 0]), json: ["error":"nonexistence"])

看起来还不错哦,不过还是少些什么,输出的信息仍然不够友好,特别是 title 这部分,我是看不懂了。

再加一个 Xcode 插件吧,Alcatraz 中搜索 DXXcodeConsoleUnicodePlugin,安装完成,在 Xcode 的 Edit 菜单中勾选 ConvertUnicodeInConsole。

易读性大大提高了:

这时我们的输出窗口就愉快了。当然了,你也可以配置你喜欢的颜色,详细的方法参见 XcodeColors 项目吧。其实你还可以在 XCGLogger 上完善一个更实用的 logger ~

再来回顾一下我们用到的开源项目,记得去 Star ~