تسجيل السجلات في تطبيقات Swift: أفضل الممارسات للمبتدئين
\n\nتسجيل السجلات ليس مجرد كتابة رسائل إلى وحدة التحكم. بالنسبة لمطور iOS/macOS المبتدئ، يمكن لنظام تسجيل سليم أن يكون شريان حياة أثناء التصحيح والمراقبة وتحليل أداء التطبيق. في هذه المقالة، سنستعرض أفضل ممارسات تسجيل السجلات في Swift، من الأساليب البسيطة إلى الأدوات الاحترافية.
\n\nلماذا من المهم تسجيل السجلات بشكل صحيح؟
\nعندما يعمل تطبيقك على جهاز المستخدم أو على الخادم، لا يمكنك ببساطة "النظر لمعرفة ما حدث خطأ". السجلات هي المصدر الوحيد للمعلومات حول سلوك البرنامج في بيئة الإنتاج. يساعد تسجيل السجلات بشكل صحيح في:
\n- \n
- العثور على الأخطاء وإصلاحها بسرعة \n
- تتبع تسلسل الأحداث \n
- تحليل الأداء \n
- فهم إجراءات المستخدم (مع مراعاة الخصوصية) \n
مستويات تسجيل السجلات: تصحيح بدون فوضى
\nأحد الأخطاء الرئيسية للمبتدئين هو استخدام print() لكل شيء. بدلاً من ذلك، قم بإدخال نظام لمستويات التسجيل. المستويات القياسية (حسب الأهمية المتزايدة):
- \n
- Debug — معلومات تفصيلية للمطور (قيم المتغيرات، استدعاءات الدوال) \n
- Info — أحداث مهمة (تحميل شاشة، طلب ناجح) \n
- Warning — مشاكل محتملة (API قديم، قيمة غير متوقعة) \n
- Error — أعطال حرجة تتطلب الانتباه \n
مثال على تطبيق بسيط في Swift:
\nenum LogLevel: String {\n case debug = "🔍 DEBUG"\n case info = "ℹ️ INFO"\n case warning = "⚠️ WARNING"\n case error = "❌ ERROR"\n}\n\nfunc log(_ message: String, level: LogLevel = .debug, file: String = #file, function: String = #function, line: Int = #line) {\n #if DEBUG\n let fileName = (file as NSString).lastPathComponent\n print("[\\(level.rawValue)] [\\(fileName):\\(line)] \\(function) -> \\(message)")\n #endif\n}\n\n\nاستخدام OSLog (نظام التسجيل الموحد)
\nبدءًا من iOS 10 و macOS Sierra، توصي Apple باستخدام OSLog بدلاً من NSLog و print(). هذا نظام تسجيل مدمج يقوم بـ:
- \n
- تصنيف الرسائل تلقائيًا \n
- دعم التفعيل/التعطيل الديناميكي للمستويات \n
- العمل في بيئة الإنتاج دون تقليل الأداء \n
- التكامل مع Instruments و Console.app \n
الإعداد الأساسي لـ OSLog:
\nimport OSLog\n\nextension Logger {\n static let network = Logger(subsystem: "com.yourapp.network", category: "network")\n static let ui = Logger(subsystem: "com.yourapp.ui", category: "ui")\n static let database = Logger(subsystem: "com.yourapp.database", category: "database")\n}\n\n// الاستخدام:\nLogger.network.info("تم تنفيذ طلب API بنجاح")\nLogger.ui.error("خطأ في عرض وحدة التحكم: \\(error.localizedDescription)")\n\n\nميزة OSLog هي أن رسائل المستوى debug و info يتم تعطيلها تلقائيًا في الإصدار النهائي إذا لم تقم بتكوين خلاف ذلك. هذا يمنع ازدحام سجلات الإنتاج.
أطر عمل لتسجيل السجلات المتقدم
\nإذا كنت بحاجة إلى إمكانيات إضافية (الكتابة إلى ملف، تدوير السجلات، التجميع عن بُعد)، فانظر إلى المكتبات الشائعة:
\n\nCocoaLumberjack
\nواحد من أكثر الأطر شيوعًا لـ Swift/Objective-C. يدعم:
\n- \n
- عدة "مستقبلات" (وحدة التحكم، ملف، خادم بعيد) \n
- تسجيل غير متزامن \n
- تنسيق الرسائل \n
- تغيير ديناميكي لمستوى التسجيل \n
import CocoaLumberjack\n\n// الإعداد في AppDelegate\nDDLog.add(DDOSLogger.sharedInstance) // وحدة التحكم\nlet fileLogger = DDFileLogger()\