Log (日誌)
- Log (日誌) 由開發者手動添加在程式碼
- 用來了解系統狀態的變化
- 系統化設計的 Log 能有效追蹤錯誤
- 最新 Log 系統最低版本 iOS 15+
豆知識
- 開發模式
- 透過 Xcode Run 會進入開發者模式
- 開發者模式在
Xcode Console、Console app (系統監視程式)都會顯示 - 開發者模式所有隱私日誌皆可讀
- 隱私性
- Log 在
Console app (系統監視程式)也會顯示 - 需注意使用者密碼等敏感資訊
- Log 在
- 效能
- OSLog 框架的 Logger 不會有效能損失
- NSLog、print 等傳統方法會損失效能
- 歷史日誌
- 讀取過去出錯的完整日誌
- 當客戶遇到問題時,能否讀取 歷史日誌 會特別關鍵
Log 使用方法
- 適合開發時快速 Debug ,用於臨時測試而不適合正式環境
- 大量使用會損失效能
let str: String? = "Hello"
// Optional("Hello")
print(str)
debugPrint
- 用來印
Optional值不會產生Optional(value)的樣式
let str: String? = "Hello"
// "Hello"
debugPrint(str)
dump
- 列出物件的所有屬性和值 (設斷點時查看的資訊)
struct User {
let id: Int
let name: String
}
let user = User(id: 1, name: "Alice")
// ▿ User
// - id: 1
// - name: "Alice"
dump(user)
NSLog
- iOS 2.0+ | macOS 10.0+
- 自帶時間戳記、執行緒資訊
- 大量使用會損失效能
- 在 iOS 10 以後被
OSLog取代
// 2025-02-10 12:34:56.789000+0800 MyApp[12345:67890] 這是一條重要訊息
NSLog("這是一條重要訊息")
OSLog
-
OSLog 是支援類型分類的系統級 Log
- 功能
- 跳轉到輸出行
- 控制隱私級別 (
public、private) - Log 類型設定
- 子系統 (subsystem)
- 類別 (category)
- 類型 (level)
- 0
trace: debug mode,用來追蹤函式進出 - 1
debug: debug mode,開發階段除錯用 - 2
info: 不影響 debug,但有助於了解系統狀態 (系統初始化、變更設定) - 3
notice: default,用於記錄可以關注但不影響運作的行為 (API成功、登入等) - 4
warning: 建議開發者關注的潛在問題 - 5
error: 錯誤但不影響運行 (API 請求失敗) - 6
critical: crash 級別的嚴重錯誤 (需要 hotfix)
- 0
- 限制
- 單條訊息限制 1000 字元
- 無法自行建立
OSLogMessage
- 功能
-
需求版本
- iOS 10.0+ | macOS 10.12+
os_log
- iOS 14.0+
Logger
- iOS 15.0+
OSLogStore: 讀取目前 process 的 Log 紀錄
- iOS 10.0+ | macOS 10.12+
os_log
import OSLog
// subsystem 使用逆域名 (Bundle Identifier)
private var subsystem = Bundle.main.bundleIdentifier!
let oslog = OSLog(subsystem: subsystem, category: "Test")
// privacy: OK
os_log(.default, log: oslog, "privacy: \("OK", privacy: .public)")
// privacy: <private>
os_log(.default, log: oslog, "privacy: \("OK", privacy: .private)")
Logger
import OSLog
// subsystem 使用逆域名 (Bundle Identifier)
private var subsystem = Bundle.main.bundleIdentifier!
extension Logger {
static let test = Logger(subsystem: subsystem, category: "Test")
}
// privacy: OK
Logger.test.notice( "privacy: \("OK", privacy: .public)")
// privacy: <private>
Logger.test.notice( "privacy: \("OK", privacy: .private)")
Console.app (系統監視程式)
- Console 會即時顯示大量的系統訊息
- 透過右上角的過濾器進行篩選
- 輸入篩選條件後能
儲存設定給之後使用
[篩選條件]:[值]
- 程序
- App 名稱
p:、proc:
- 子系統
- Bundle Identifier
s:
- 類別
- category
c:
- 訊息類型
- trace、debug (除錯)
- info (資訊)
- default、notice
- warning、error (錯誤)
- fault、critical (缺失)
t: