大家Xcode印debug訊息應該都是用print()吧😗
最近看了WWDC23的影片,現在還有Logger可以用,搭配Xcode15讓你一目瞭然,馬上就來試用看看

整齊的console
Logger使用方式
- 要先import os framework
import os
- 創造一個Logger
- subsystem: bundle identifier
- category: class or component name
let logger = Logger(subsystem: "ButtonDemo", category: "Button")
- 印訊息
logger.log("button is pressed")基本就這樣👏
輸出
也可以把log輸出成一個檔案- --device Collect logs from first device found
- --device-name <name> Collect logs from device with the given name
- --device-udid <UDID> Collect logs from device with the given UDID
- --last <num>[m|h|d] Collect logs starting <num>[m|h|d] ago
- --output <path> Output log archive to the given path
- --size <num>[k|m] Limit log collection to the given size
- --start <time> Collect logs starting at the given time
log collect --device --start '2024-06-21 16:42:00' --output ButtonDemo.logarchive

log檔案
Logger Action
有五種可以用,訊息持久性(message persistence)由小到大,Performace由快到慢
- Debug: 只有當下可以看,最快
- Info: 用指令可以collect log
- Notice (default): 存起來直到儲存已滿
- Error: 存起來直到儲存已滿
- Fault: 存起來直到儲存已滿,最慢

console裡的樣子
Xcode15上的顯示
要用iOS17以上裝置跑+把Metadata的選項打開,才會有精美UI

iOS15跟16長得平凡無奇🫥

為何做了以上這些設定還是沒出現
為何console都是一片黑? 很可能是專案設定早就把系統的log都禁掉了(像我的專案就是QQ)
要去scheme> OS_ACTIVITY_MODE disable拿掉,就會出現了

scheme

OS_ACTIVITY_MODE
優點
更好的組織Log:以前因為print太多,前面都會加一些奇怪符號
@@@@@@@@@@@@@@@@@@
============
有了subsystem跟category就比較好分類,找到自己在哪。
例如:我們有個打API的套件會印response出來,每次要看,都要在茫茫print中找半天
用新的就可以把subsystem設成套件名稱,category設成api的path
這樣就變得非常好搜尋。
缺點
我認為的缺點🥹
- 實機上沒有:跑實機的話console不會顯示,但print是模擬器跟實機都可以用。
- 系統log很多都是不需要的:需要把系統log顯示打開,會跑出一大堆系統log非常混亂。
- 限制iOS17以上:模擬器也要iOS17以上才有精美UI,以下看起來跟print差不多。
參考資料
這邊有人做文字整理版的,滿不錯的
https://www.wwdcnotes.com/notes/wwdc20/10168/
https://www.wwdcnotes.com/notes/wwdc23/10226/