تسجيل السجلات في تطبيقات Swift: أفضل الممارسات للمبتدئين
تسجيل السجلات هو أحد أهم الأدوات في ترسانة المطور. بدونه، يتحول تصحيح الأخطاء المعقدة في الإنتاج إلى تخمين. في هذه المقالة، سنستعرض أفضل الممارسات لتسجيل السجلات لتطبيقات Swift على iOS وmacOS، بدءًا من الأساسيات وصولاً إلى التقنيات المتقدمة. ستتعلم كيف لا تقتصر على مجرد طباعة النص في وحدة التحكم، بل بناء نظام يساعدك في العثور على الأخطاء وإصلاحها بسرعة.
لماذا لا يجب استخدام print() في الإنتاج؟
يستخدم العديد من المطورين المبتدئين print() لعرض معلومات التصحيح. هذا يعمل في مرحلة التطوير، لكن في التطبيق النهائي، يخلق هذا النهج العديد من المشكلات:
- لا يوجد تحكم في المستويات: لا يمكنك تصفية الأخطاء فقط أو التحذيرات فقط.
- انخفاض الأداء:
print()يمنع الخيط بشكل متزامن، مما قد يسبب تأخيرات ملحوظة في واجهة المستخدم. - غياب التصنيف: جميع الرسائل تتراكم في كومة واحدة، ولا يمكن معرفة أي وحدة أرسلت الرسالة.
- لا استمرارية: مخرجات
print()لا تُحفظ على جهاز المستخدم، ولا يمكنك تحليل السجلات بعد تعطل التطبيق. - مشاكل أمنية: قد يؤدي
print()المتروك عن طريق الخطأ إلى عرض بيانات حساسة في وحدة التحكم.
بدلاً من print()، استخدم os_log من إطار العمل Unified Logging (متاح منذ iOS 10 / macOS 10.12).
إعداد OSLog: مثال أساسي
للبدء، قم باستيراد إطار العمل os.log وأنشئ كائن مسجل للوحدة الخاصة بك:
import os.log
let logger = Logger( subsystem: "com.yourapp.networking", category: "API")
func fetchUsers() { logger.info("بدء تحميل المستخدمين...") // منطق الطلب logger.debug("تم استلام \\(usersCount) مستخدم")}شرح المعاملات:
subsystem— عادةً معرف تطبيقك (bundle ID). يسمح بتجميع السجلات حسب التطبيقات.category— اسم الوحدة أو المكون (مثل "UI", "Network", "Database").
في Xcode، يمكنك تصفية السجلات حسب subsystem و category في وحدة التحكم، مما يبسط التحليل بشكل كبير.
مستويات التسجيل: متى تستخدم ماذا؟
يدعم Unified Logging 6 مستويات للتسجيل. الاختيار الصحيح للمستوى هو نصف النجاح:
debug— للتصحيح أثناء التطوير. لا يُحفظ على جهاز المستخدم (إلا إذا تم تمكين التنميط الخاص).info— للأحداث الهامة التي قد تكون مفيدة أثناء التحليل (مثل فتح شاشة، طلب ناجح).notice— المستوى القياسي. يُستخدم للأحداث التي ليست أخطاء ولكنها تستحق الاهتمام.error— للأخطاء التي تمت معالجتها (مثل فشل تحميل البيانات، لكن التطبيق يستمر في العمل).fault— للأعطال الحرجة التي تؤدي إلى تعطل التطبيق أو فقدان البيانات.critical— يُستخدم نادرًا، للمواقف الشديدة الخطورة (مثل تلف قاعدة البيانات).
import os.log
let logger = Logger(subsystem: "com.yourapp", category: "general")
logger.debug("فقط للتصحيح: \\(someVariable)")logger.info("فتح المستخدم شاشة الملف الشخصي")logger.notice("تم اكتشاف سيناريو غير قياسي")logger.error("خطأ في الشبكة: \\(error.localizedDescription)")logger.fault("خطأ حرج: التطبيق ب")