مقدمة: لماذا تحتاج إلى التسجيل (Logging) في Swift؟
التسجيل (Logging) هو أداة أساسية للمطور تتيح تتبع حالة التطبيق، واكتشاف الأخطاء، وتحليل سلوك المستخدم. في نظام Swift البيئي (iOS/macOS)، يمكن للتسجيل المُهيأ بشكل صحيح أن يوفر ساعات من التصحيح ويساعد في تجنب المشاكل في إصدارات الإنتاج (production).
في هذه المقالة، سنستعرض أفضل ممارسات التسجيل في Swift: بدءًا من الحلول المدمجة من Apple وصولاً إلى المكتبات الخارجية الشائعة. ستتعلم كيف لا تثقل كاهل التطبيق، وكيف تحمي البيانات الحساسة، وكيف تجعل السجلات مفيدة لفريق العمل بأكمله.
1. الأدوات المدمجة: OSLog و print
1.1 لماذا يعتبر print() سيئًا
أبسط طريقة للتسجيل هي الأمر print(). ومع ذلك، لا يُنصح باستخدامه في إصدار الإنتاج (production):
- لا توجد مستويات أهمية (info, warning, error).
- من المستحيل تصفية السجلات في وحدة تحكم Xcode.
- يتم إخراج النص حتى في الإصدار النهائي (إذا لم يتم حذفه يدويًا).
- لا يوجد هيكلة للبيانات.
1.2 OSLog — المعيار من Apple
بدءًا من iOS 10 و macOS 10.12، توصي Apple باستخدام os_log من إطار العمل os.log. هذه آلية مدمجة تعمل بسرعة وأمان.
import os.log
let logger = Logger(subsystem: "com.example.myapp", category: "network")
func fetchData() { logger.info("بدء تحميل البيانات") // ... كود التحميل logger.warning("استجاب الخادم بتأخير") // ... معالجة الخطأ logger.error("فشل الاتصال بالخادم: \\(error.localizedDescription)")}مزايا OSLog:
- التعطيل التلقائي في الإصدارات النهائية (باستثناء الأخطاء).
- دعم الفئات (categories) والأنظمة الفرعية (subsystems) للتصفية.
- التكامل مع Console.app و Xcode.
- الأمان: يتم إخفاء البيانات الخاصة تلقائيًا (علامة
private).
2. SwiftLog — واجهة برمجة تطبيقات عالمية
2.1 ما هو SwiftLog؟
SwiftLog هي مكتبة مفتوحة المصدر من Apple توفر واجهة موحدة للتسجيل. إنها مستقلة عن المنصة وتسمح بتوصيل أنظمة خلفية مختلفة (OSLog، ملفات، خوادم).
2.2 التوصيل والإعداد
أضف SwiftLog عبر Swift Package Manager:
// Package.swiftdependencies: [ .package(url: "https://github.com/apple/swift-log.git", from: "1.5.0")]مثال على الاستخدام:
import Logging
let logger = Logger(label: "com.example.app")
logger.info("تم تشغيل التطبيق")logger.warning("شحن البطارية منخفض: \\(batteryLevel)%")logger.error("خطأ حرج: \\(error)")
// إعداد مستوى التسجيلLoggingSystem.bootstrap { label in var handler = StreamLogHandler.standardOutput(label: label) handler.logLevel = .debug return handler}الإمكانيات الرئيسية:
- المستويات: trace, debug, info, notice, warning, error, critical.
- البيانات الوصفية (أي حقول إضافية).
- سهولة استبدال النظام الخلفي (مثلاً للإرسال إلى Crashlytics).
- تكلفة صفرية عند تعطيل المستوى (أسرع من
print).
3. المكتبات الخارجية: CocoaLumberjack و Pulse
3.1 CocoaLumberjack — المرونة والقوة
واحدة من أشهر المكتبات لـ Objective-C و Swift. تسمح بكتابة السجلات إلى ملفات، وحدة التحكم، خادم بعيد، وحتى إلى قاعدة بيانات.
import CocoaLumberjack
// الإعدادDDLog.add(DDOSLogger.sharedInstance) // وحدة التحكمlet fileLogger = DDFileLogger()fileLogger.rollingFrequency = 60 * 60 * 24 // 24 ساعةDDLog.add(fileLogger)
// الاستخدامDDLogInfo("تم توثيق دخول المستخدم")DDLogWarn("انتهاء مهلة الشبكة")DDLogError("