使用Logger取代print()在Xcode上輸出訊息

閱讀時間約 4 分鐘

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

整齊的console

整齊的console

Logger使用方式

  1. 要先import os framework
import os​
  1. 創造一個Logger
  • subsystem: bundle identifier
  • category: class or component name
let logger = Logger(subsystem: "ButtonDemo", category: "Button")
  1. 印訊息
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檔案

log檔案

Logger Action

有五種可以用,訊息持久性(message persistence)由小到大,Performace由快到慢

  • Debug: 只有當下可以看,最快
  • Info: 用指令可以collect log
  • Notice (default): 存起來直到儲存已滿
  • Error: 存起來直到儲存已滿
  • Fault: 存起來直到儲存已滿,最慢
console裡的樣子

console裡的樣子

Xcode15上的顯示

要用iOS17以上裝置跑+把Metadata的選項打開,才會有精美UI

raw-image

iOS15跟16長得平凡無奇🫥

raw-image


為何做了以上這些設定還是沒出現

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

scheme

scheme


OS_ACTIVITY_MODE

OS_ACTIVITY_MODE

優點

更好的組織Log:以前因為print太多,前面都會加一些奇怪符號
@@@@@@@@@@@@@@@@@@
============
有了subsystem跟category就比較好分類,找到自己在哪。
例如:我們有個打API的套件會印response出來,每次要看,都要在茫茫print中找半天
用新的就可以把subsystem設成套件名稱,category設成api的path
這樣就變得非常好搜尋。


缺點

我認為的缺點🥹

  1. 實機上沒有:跑實機的話console不會顯示,但print是模擬器跟實機都可以用。
  2. 系統log很多都是不需要的:需要把系統log顯示打開,會跑出一大堆系統log非常混亂。
  3. 限制iOS17以上:模擬器也要iOS17以上才有精美UI,以下看起來跟print差不多。

參考資料

這邊有人做文字整理版的,滿不錯的

https://www.wwdcnotes.com/notes/wwdc20/10168/

https://www.wwdcnotes.com/notes/wwdc23/10226/







avatar-img
7會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Michelle Chen的沙龍 的其他內容
UIEdgeInsets 是一個結構體,用來表示矩形的邊距。它通常在視圖佈局中使用,用於修改視圖的框架(frame)。邊距值可以是正數或負數,這會對矩形的大小產生不同的影響。 UIEdgeInsets 結構體 UIEdgeInsets 結構體包含四個屬性: top:矩形頂部的邊距 left:
iOS15推出了新的按鈕外觀設定功能,讓設定變得更加直觀。使用不同的圓角設定和圖片位置可以輕鬆創建不同風格的按鈕。另外,新的選取效果變化功能也讓按鈕設計更加靈活。本文將介紹這些新功能的使用方法和效果。
本文介紹如何使用UINavigationBarAppearance調整四種場景下的UI外觀,並探討客製化返回鍵UI又保留返回手勢的做法,可以有效地客製化NavigationBar的外觀,並避免一些NG作法。
這篇文章介紹了 Swift 中字串的比較方法,並討論了使用日期字串進行比較的結果。同時也介紹了數字字串、符號字串和表情符號字串的比較原理。最後指出比較日期字串還是要轉成Date才是安全的做法。
最近碰到個神奇的需求,App啟動時,才要用firebase remoteConfig去決定初始畫面。該文章詳細介紹了在App啟動時如何利用firebase remoteConfig去決定初始畫面,以及解決在推播的情況下造成跳轉無效的問題。
這篇文章主要討論了在 iOS 開發中,使用 UIImagePickerController 來選取 GIF 圖片時會變成靜態截圖的問題,並推薦了使用新的 PHPickerViewController 選取 GIF 檔案。同時提供了一些處理 GIF 圖片的方法。
UIEdgeInsets 是一個結構體,用來表示矩形的邊距。它通常在視圖佈局中使用,用於修改視圖的框架(frame)。邊距值可以是正數或負數,這會對矩形的大小產生不同的影響。 UIEdgeInsets 結構體 UIEdgeInsets 結構體包含四個屬性: top:矩形頂部的邊距 left:
iOS15推出了新的按鈕外觀設定功能,讓設定變得更加直觀。使用不同的圓角設定和圖片位置可以輕鬆創建不同風格的按鈕。另外,新的選取效果變化功能也讓按鈕設計更加靈活。本文將介紹這些新功能的使用方法和效果。
本文介紹如何使用UINavigationBarAppearance調整四種場景下的UI外觀,並探討客製化返回鍵UI又保留返回手勢的做法,可以有效地客製化NavigationBar的外觀,並避免一些NG作法。
這篇文章介紹了 Swift 中字串的比較方法,並討論了使用日期字串進行比較的結果。同時也介紹了數字字串、符號字串和表情符號字串的比較原理。最後指出比較日期字串還是要轉成Date才是安全的做法。
最近碰到個神奇的需求,App啟動時,才要用firebase remoteConfig去決定初始畫面。該文章詳細介紹了在App啟動時如何利用firebase remoteConfig去決定初始畫面,以及解決在推播的情況下造成跳轉無效的問題。
這篇文章主要討論了在 iOS 開發中,使用 UIImagePickerController 來選取 GIF 圖片時會變成靜態截圖的問題,並推薦了使用新的 PHPickerViewController 選取 GIF 檔案。同時提供了一些處理 GIF 圖片的方法。
你可能也想看
Google News 追蹤
Thumbnail
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
Thumbnail
介紹工作後幾個常見的小問題,包括寫 Log 的好習慣、本地印出錯誤或過程、PHPCS 工具、變數儲存於設定檔、避免魔術數字、程式碼靜態分析與動態分析。
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
最近幫忙弄了貼圖, 寫個心得來小小紀念一下~ 不囉嗦,先上圖~
Thumbnail
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
Thumbnail
logging 是 Python 中用於記錄程式運行時信息的模組,它可以幫助你在開發過程中更好地管理和追蹤程式的執行狀態和錯誤信息。 本文較著重使用兩種不同的方法來創建日誌紀錄。 其他有關logging的教學,我推薦以下文章,他介紹蠻詳細的,我就不多贅述了。
Thumbnail
原「主編後記」裡的分享(新單元新嘗試)。思考著,如果能讓更多人接收到這些知識點就更棒了⋯⋯
IG重新整理了一下,試著做圖文,這篇談分享。
Thumbnail
呈上篇,若是在大型系統中使用,重複被調用時,在每次紀錄時都會創建一個新的 FileHandler,這會導致日誌處理器不斷累積,從而使日誌重複記錄。 [Python]使用logging創建兩個以上的日誌紀錄 使用__new__的方法來避免重複調用 改良後 setup_logger 方法中創建一
Thumbnail
介紹工作後幾個常見的小問題,包括寫 Log 的好習慣、本地印出錯誤或過程、PHPCS 工具、變數儲存於設定檔、避免魔術數字、程式碼靜態分析與動態分析。
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
最近幫忙弄了貼圖, 寫個心得來小小紀念一下~ 不囉嗦,先上圖~
Thumbnail
呈上次使用logging來撰寫日誌,利用類別包裝的方式,可實現多個日誌紀錄器,但發現這樣就失去它原先,可以回傳是誰呼叫他並記錄行數的功能。 [Python]使用logging創建兩個以上的日誌紀錄 若開啟函式名稱、行數及訊息的功能,就會像這樣,幾乎都是記錄到,我定義中類別的函式
Thumbnail
logging 是 Python 中用於記錄程式運行時信息的模組,它可以幫助你在開發過程中更好地管理和追蹤程式的執行狀態和錯誤信息。 本文較著重使用兩種不同的方法來創建日誌紀錄。 其他有關logging的教學,我推薦以下文章,他介紹蠻詳細的,我就不多贅述了。
Thumbnail
原「主編後記」裡的分享(新單元新嘗試)。思考著,如果能讓更多人接收到這些知識點就更棒了⋯⋯
IG重新整理了一下,試著做圖文,這篇談分享。