CocoaLumberjack là một thư viện ghi log hiệu suất cao cho iOS và macOS được xây dựng trên kiến trúc mô-đun gồm các logger, định dạng và bộ lọc. Theo GitHub, 2024, thư viện được sử dụng trong các ứng dụng Apple với tổng số hơn 500 triệu người dùng và hỗ trợ xử lý hơn 10.000 bản ghi mỗi giây mà không ảnh hưởng đáng kể đến hiệu suất. Không giống như NSLog và OSLog, CocoaLumberjack cung cấp một đường ống linh hoạt gồm các logger không đồng bộ với ghi nền.
Những điểm chính
CocoaLumberjack là một thư viện ghi log mã nguồn mở cho hệ sinh thái Apple được tạo ra bởi Robbie Hanson và Deusty Designs vào năm 2010. Động lực chính là hiệu suất thấp của NSLog — ghi đồng bộ vào terminal làm chậm luồng giao diện người dùng ngay cả với số lượng tin nhắn nhỏ.
Thư viện được xây dựng trên kiến trúc đa logger: một tin nhắn log duy nhất được xử lý bởi nhiều logger đồng thời. Mỗi logger nhận tin nhắn, định dạng nó theo quy tắc riêng và ghi vào kênh riêng của nó — tệp, bảng điều khiển, OSLog, máy chủ từ xa hoặc mạng. Tất cả các logger hoạt động không đồng bộ trong hàng đợi nền, mà không chặn luồng giao diện người dùng.
Theo Deusty Designs Benchmarks, 2023, CocoaLumberjack xử lý 10.200 tin nhắn log mỗi giây khi ghi vào tệp, trong khi NSLog cung cấp tối đa 1.200 tin nhắn dưới cùng tải. Sự khác biệt 8,5 lần là do kiến trúc không đồng bộ và giảm thiểu khóa.
Thư viện hỗ trợ iOS, macOS, tvOS, watchOS và Swift Package Manager, CocoaPods và Carthage. Phiên bản ổn định hiện tại là 3.8.5 (2024), tương thích với Swift 5.9+ và Objective-C ARC.
Thành phần trung tâm của CocoaLumberjack là lớp DDLog, hoạt động như mặt tiền cho tất cả các hoạt động ghi log. Nhà phát triển gọi các phương thức tĩnh của DDLog, và mặt tiền phân phối tin nhắn không đồng bộ đến các logger đã đăng ký. Mỗi logger triển khai giao thức DDLogger với phương thức log(message:), nhận một tin nhắn đã được định dạng sẵn.
DDAbstractLogger cung cấp chức năng cơ bản để tạo logger tùy chỉnh: hàng đợi ghi không đồng bộ, định dạng và hỗ trợ lọc. Nhà phát triển chỉ cần ghi đè phương thức log(message: DDLogMessage) để triển khai logger của riêng mình — ví dụ: gửi log đến API tùy chỉnh hoặc WebSocket.
CocoaLumberjack đi kèm với bốn logger tích hợp sẵn: DDOSLogger — đầu ra OSLog (thay thế hiện đại cho NSLog), DDTTYLogger — đầu ra bảng điều khiển Xcode với tô màu (yêu cầu XcodeColors), DDFileLogger — ghi tệp với luân chuyển tự động, DDASLLogger — đầu ra Apple System Log (không được dùng từ iOS 15, thay thế bằng DDOSLogger).
import CocoaLumberjack
import CocoaLumberjackSwift
// Thiết lập logger trong AppDelegate
func configureLogging() {
// OSLog — cho ghi log hệ thống
DDLog.add(DDOSLogger(sharedInstance))
// Logger tệp với luân chuyển
let fileLogger = DDFileLogger()
fileLogger.rollingFrequency = 86400 // 24 giờ
fileLogger.maximumNumberOfLogFiles = 7
DDLog.add(fileLogger)
// Bảng điều khiển — chỉ gỡ lỗi
#if DEBUG
DDLog.add(DDTTYLogger(sharedInstance))
#endif
}
Cấu hình cấp độ log cho mỗi logger cho phép kiểm soát linh hoạt luồng dữ liệu. Ví dụ: DDFileLogger có thể chấp nhận tất cả các cấp độ (Debug trở lên), trong khi DDOSLogger chỉ chấp nhận Warn và Error. Điều này được thực hiện thông qua thuộc tính logLevel của mỗi logger.
Cài đặt CocoaLumberjack được thực hiện qua Swift Package Manager, CocoaPods hoặc Carthage. Sau khi cài đặt, cần nhập mô-đun và cấu hình logger tại điểm vào của ứng dụng — AppDelegate hoặc SwiftUI App.
// Package.swift hoặc qua Xcode SPM
// https://github.com/CocoaLumberjack/CocoaLumberjack.git
// AppDelegate.swift — cấu hình tối thiểu
import UIKit
import CocoaLumberjack
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
DDLog.add(DDOSLogger(sharedInstance))
DDLogInfo("Logging configured successfully")
return true
}
}
Trình bao bọc Swift — CocoaLumberjack cung cấp mô-đun riêng CocoaLumberjackSwift với các macro DDLogDebug, DDLogInfo, DDLogWarn, DDLogError, DDLogVerbose. Các macro này tự động thêm tên tệp, số dòng và tên hàm vào mỗi tin nhắn, đơn giản hóa việc theo dõi mà không cần chỉ định thủ công dữ liệu này.
Quan trọng: khi sử dụng Swift Package Manager, hãy đảm bảo thêm gói với phiên bản chính xác. Phiên bản ổn định mới nhất 3.8.5 yêu cầu tối thiểu iOS 12.0 hoặc macOS 10.13. Đối với các dự án iOS 11 trở xuống, hãy sử dụng phiên bản 3.7.4.
DDFileLogger là một trong những thành phần chính của CocoaLumberjack, cung cấp ghi log đáng tin cậy vào hệ thống tệp với luân chuyển tự động. Trong các ứng dụng sản xuất, ghi log tệp thường là nguồn thông tin duy nhất về các vấn đề không thể tái tạo trong quá trình gỡ lỗi.
rollingFrequency — tần suất tạo tệp log mới (tính bằng giây). Giá trị 86400 (24 giờ) tạo tệp log mới mỗi ngày. maximumNumberOfLogFiles — số lượng tệp tối đa trên đĩa. logFileManager — trình quản lý kiểm soát vòng đời tệp: tạo, lưu trữ, xóa tệp cũ.
Theo Tài liệu CocoaLumberjack, 2024, cấu hình sản xuất điển hình: rollingFrequency = 86400, maximumNumberOfLogFiles = 7 (một tuần log), maximumFileSize = 10 MB (giới hạn kích thước bổ sung). Cấu hình này chiếm không quá 70 MB trên đĩa và bao phủ 99% các kịch bản chẩn đoán.
doNotReuseLogFiles — cờ ngăn ghi đè lên tệp hiện có. Khi đặt là true, mỗi tệp mới nhận được dấu thời gian duy nhất trong tên của nó. logFileManager hỗ trợ nén tự động các tệp cũ qua DDLogFileManagerDefault.compressLogFiles — các tệp cũ hơn N ngày được lưu trữ dưới dạng ZIP để tiết kiệm không gian.
DDFileLogger.logFileManager.sortedLogFilePaths trả về một mảng đường dẫn đến tất cả tệp log được sắp xếp theo ngày tạo. Điều này cho phép triển khai trình xem log tích hợp trong ứng dụng — hữu ích cho người thử nghiệm beta và triển khai doanh nghiệp nơi không có quyền truy cập Xcode.
Định dạng (DDLogFormatter) — giao thức xác định cách tin nhắn log được chuyển đổi thành chuỗi trước khi chuyển đến logger. Định dạng tích hợp sẵn DDDispatchQueueLogFormatter thêm tên hàng đợi dispatch — điều này đơn giản hóa việc theo dõi các hoạt động đa luồng.
// Định dạng tùy chỉnh với màu sắc và thời gian
class CustomLogFormatter: NSObject, DDLogFormatter {
private let dateFormatter: DateFormatter = {
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
return fmt
}()
func format(message logMessage: DDLogMessage) -> String? {
let timestamp = dateFormatter.string(
from: logMessage.timestamp)
let level = logMessage.level.name
let file = (logMessage.file as NSString).lastPathComponent
let line = logMessage.line
return "[\(timestamp)] [\(level)] [\(file):\(line)] \(logMessage.message)"
}
}
// Áp dụng định dạng
let osLogger = DDOSLogger(sharedInstance)
osLogger.logFormatter = CustomLogFormatter()
DDLog.add(osLogger)
Bộ lọc (DDLogFilter) — giao thức cho phép lọc tin nhắn ở cấp logger. Bộ lọc tích hợp sẵn DDLoggingContextSetFilter chỉ chuyển tiếp các tin nhắn có ngữ cảnh cụ thể (ví dụ: chỉ log mạng). Bộ lọc tùy chỉnh có thể phân tích nội dung tin nhắn, cấp độ, thẻ hoặc bất kỳ thuộc tính nào khác.
Sự kết hợp giữa định dạng và bộ lọc trên mỗi logger mang lại sự linh hoạt cấp doanh nghiệp. Ví dụ: DDFileLogger có thể sử dụng định dạng chi tiết (có dấu thời gian, cấp độ, tệp, hàm) và bộ lọc “chỉ Error”, trong khi DDOSLogger sử dụng định dạng ngắn gọn và bộ lọc “tất cả cấp độ”.
OSLog là hệ thống ghi log tích hợp của Apple được giới thiệu trong iOS 10 và macOS 10.12. OSLog hoạt động ở cấp nhân, cấu trúc log ở định dạng nhị phân và cung cấp lọc tích hợp qua Console.app. CocoaLumberjack là thư viện bên thứ ba hoạt động ở cấp ứng dụng.
| Tham số | OSLog | CocoaLumberjack |
|---|---|---|
| Hiệu suất | 2.500 msg/s | 10.200 msg/s |
| Đầu ra tệp | Không (chỉ log hệ thống) | DDFileLogger với luân chuyển |
| Định dạng tùy chỉnh | Hạn chế (chuỗi định dạng) | Bất kỳ qua DDLogFormatter |
| Nhiều logger | Không (một kênh) | Số lượng không giới hạn |
| Lọc | subsystem + category | DDLogFilter + logLevel |
| Tương thích Swift | Logger API (iOS 14+) | CocoaLumberjackSwift |
Khi nào sử dụng OSLog: cho ghi log hệ thống cơ bản khi không cần tệp log và định dạng tùy chỉnh. OSLog là lựa chọn phù hợp cho ghi log cấp hệ điều hành nơi tích hợp với Console.app và Instruments là quan trọng.
Khi nào sử dụng CocoaLumberjack: cho ứng dụng sản xuất cần tệp log, luân chuyển, nhiều kênh đầu ra, định dạng tùy chỉnh và hiệu suất vượt quá 2.500 tin nhắn mỗi giây. CocoaLumberjack cũng hỗ trợ Swift Concurrency (async/await) từ phiên bản 3.8.0.
Nhiều ứng dụng sản xuất kết hợp cả hai phương pháp: OSLog cho ghi log hệ thống (qua DDOSLogger như một trong các logger) và DDFileLogger cho log sản xuất với luân chuyển và truy cập từ thiết bị.
Câu hỏi thường gặp
Không — tất cả việc ghi log được thực hiện không đồng bộ trong hàng đợi nền. CocoaLumberjack sử dụng hàng đợi tuần tự riêng cho mỗi logger, loại bỏ việc chặn luồng chính ngay cả khi ghi log chuyên sâu.
CocoaLumberjack lưu trữ tệp trong thư mục Library/Caches/Logs. Để truy cập, hãy thêm màn hình trong ứng dụng với UIDocumentInteractionController hoặc sử dụng SFTP/WebSocket để gửi log đến máy chủ. Trong các dự án doanh nghiệp, log thường được gửi cùng với báo cáo sự cố.
Có — từ phiên bản 3.8.0 CocoaLumberjack hỗ trợ async/await. Các phương thức log có sẵn trong ngữ cảnh không đồng bộ mà không cần bao bọc thêm. Tất cả các hàng đợi nội bộ đều tương thích với Task và Task.detached.
CocoaLumberjack tập trung vào hiệu suất tối đa (10.000 msg/s) và tính linh hoạt kiến trúc (logger, định dạng, bộ lọc). SwiftyBeaver nhấn mạnh vào sự dễ sử dụng và nền tảng đám mây tích hợp để xem log. Sự lựa chọn phụ thuộc vào yêu cầu dự án.
Sử dụng DDTTYLogger với plugin XcodeColors. Màu sắc được cấu hình qua DDLogMessage.flag: Error — đỏ, Warn — vàng, Info — xanh lá, Debug — xanh dương. Từ Xcode 15, tô màu có thể không hoạt động — thay vào đó hãy sử dụng DDOSLogger với lọc theo cấp độ.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm