os_log: ما هي، الإمكانيات وكيف يعمل السجل الموحد في Apple

المؤلف: IT Sectr نُشر: 2026-05-28 وقت القراءة: 9 دق

os_log هي واجهة برمجة تطبيقات السجل الموحد من Apple لنظامي iOS و macOS والتي حلت محل NSLog و os_trace. على عكس الآليات القديمة، تعمل os_log على مستوى النواة: يتم تخزين الرسائل في مخزن مؤقت دائري وتكتب على القرص فقط عند الوصول إلى حد النشاط. وفقًا لـ Apple WWDC 2016، تقلل os_log الحمل على القرص بمقدار 10 مرات مقارنة بـ NSLog وتمنح التحكم في مستوى التفاصيل من خلال الفئات والأنواع. إنها أداة التشخيص الرئيسية لمطور iOS: من خلال Console.app يمكنك تصفية الرسائل حسب العملية والفئة ومستوى الأهمية في الوقت الفعلي.

الوجبات الرئيسية

  • os_log هي واجهة برمجة تطبيقات تسجيل النظام من Apple والتي تخزن الرسائل في النواة وتقلل الحمل على القرص بنسبة تصل إلى 90% مقارنة بـ NSLog
  • المستويات — Default و Info و Debug و Error و Fault — يتم تصفية كل منها بشكل مستقل ويمكن تمكينها أو تعطيلها من خلال ملف تعريف جمع السجلات
  • الفئات — تسميات نصية داخل subsystem واحد تسمح بتجميع السجلات حسب وحدات التطبيق دون إنشاء ملفات منفصلة
  • الخصوصية — يقوم os_log تلقائيًا بإخفاء البيانات بين علامتي اقتباس والمحددة كخاصة وتشفيرها في سجلات الإنتاج
  • log collect — أداة سطر أوامر لتصدير السجلات المجمعة من الجهاز لتحليلها لاحقًا في Console.app

ما هي os_log

os_log هي واجهة برمجة تطبيقات سجل موحد قدمتها Apple في iOS 10 و macOS Sierra. جمعت آليات التسجيل المتباينة NSLog و os_trace و syslog في نظام واحد مع تخزين مؤقت على مستوى نواة XNU.

على عكس NSLog الذي يكتب كل رسالة بشكل متزامن على القرص ويحظر الخيط، يستخدم os_log مخزنًا مؤقتًا دائريًا غير متزامن في الذاكرة. يتم تفريغ الرسائل على القرص فقط عندما يتجاوز النشاط حدًا معينًا أو بأمر log collect. هذا يقلل بشكل جذري من تأثير التسجيل على أداء التطبيق.

يدعم os_log ستة مستويات من الأهمية، والتفريق حسب subsystem و category، وآلية خصوصية مدمجة: يتم إخفاء البيانات المحددة كخاصة تلقائيًا في سجلات الإنتاج ولا تكون متاحة إلا للمطور عند الاتصال عبر Xcode.

تاريخ السجل الموحد

قبل iOS 10، كان المطورون يستخدمون NSLog لتصحيح الأخطاء و syslog لرسائل النظام. كان NSLog يكتب إلى stderr ووحدة التحكم، لكنه كان غير فعال للغاية: كل رسالة كانت تُكتب بشكل متزامن على القرص، مما تسبب في تأخيرات في واجهة المستخدم عند التسجيل المتكرر. حل os_log هذه المشكلة بنقل التخزين المؤقت إلى جزء BSD من نواة XNU وجعل عمليات الكتابة على القرص غير متزامنة.

أين يستخدم os_log

os_log يستخدم في جميع تطبيقات Apple وهو موصى به من قبل Apple كواجهة برمجة التطبيقات الوحيدة للتسجيل لأنظمة iOS و macOS و tvOS و watchOS. يستخدمه النظام وتطبيقات الطرف الثالث لكتابة الرسائل في قاعدة بيانات موحدة — يتم تخزينها في الذاكرة وتفريغها بشكل دوري على القرص. يمكن تحليل هذه السجلات من خلال Console.app على Mac أو عبر أمر log في الطرفية.

كيف تعمل os_log: البنية والتخزين المؤقت

تتكون بنية os_log من ثلاث طبقات: واجهة برمجة تطبيقات من جانب العميل في مساحة المستخدم (libsystem_trace.dylib)، ومخزن مؤقت دائري في نواة XNU، وخفيض logd الذي يفرغ المخزن المؤقت بشكل غير متزامن على القرص.

عندما يستدعي التطبيق os_log، يتم نسخ الرسالة إلى مخزن مؤقت دائري للنواة بحجم عدة ميغابايت. يعمل المخزن وفق مبدأ FIFO: إذا كان ممتلئًا، يتم استبدال الرسائل القديمة بأخرى جديدة. يقوم الخفيض logd بفحص المخزن بشكل دوري وحفظ الرسائل في ملفات .tracev3 في منطقة محمية من نظام الملفات.

وفقًا لـ Apple Engineering، يتراوح التأخير النموذجي من استدعاء os_log حتى ظهور الرسالة في Console.app من 1 إلى 5 ثوانٍ على الجهاز وحتى 60 ثانية عند التفريغ على القرص في وضع الدفعة. هذه مقايضة متعمدة: أداء التطبيق لا يتأثر بالتسجيل، لكن المطور يرى الرسائل مع تأخير طفيف.

swift
// إعلان os_log عبر OSLog
import OSLog

let logger = Logger(
    subsystem: "com.example.app",
    category: "network"
)

المخزن المؤقت الدائري وإعداداته

المخزن المؤقت الدائري لـ os_log له حجم ثابت ولا يمكن تغييره من مساحة المستخدم. يتراوح حجم المخزن من 256 كيلوبايت على Apple Watch إلى 4 ميغابايت على Mac. عندما يولد التطبيق رسائل أكثر مما يمكن للمخزن استيعابه، تُفقد الرسائل القديمة — هذا سلوك متوقع للتسجيل عالي الحجم.

لجمع طويل الأجل لجميع الرسائل، يستخدم أمر log collect. يقوم بتشغيل خفيض جمع على الجهاز ويصدر .logarchive إلى كمبيوتر المطور. في هذا الوضع، لا يتم استبدال المخزن — تُكتب الرسائل مباشرة إلى الأرشيف.

مستويات os_log: Default و Info و Debug و Error و Fault

os_log يدعم خمسة مستويات من الأهمية، كل منها مسؤول عن نوع مختلف من الرسائل ويتم معالجتها بشكل مختلف من قبل النظام. Default هو المستوى الأساسي للرسائل التي تدخل المخزن دائمًا. يتم تعطيل Info و Debug في إصدارات الإنتاج بدون ملف تعريف جمع. Error و Fault نشطان دائمًا ويتم وضع علامة خاصة عليهما في قاعدة البيانات.

المستوىالمعنىالدخول إلى المخزن افتراضيًا
Defaultرسائل عادية مهمة للتشخيصنعم
Infoرسائل إعلامية للتحليل التفصيليلا (فقط مع ملف تعريف)
Debugرسائل تصحيح أخطاء للتطويرلا (فقط مع ملف تعريف)
Errorأخطاء تتطلب الانتباهنعم
Faultأعطال حرجة تؤدي إلى تعطلنعم

اختيار مستوى الأهمية الصحيح مهم للأداء: Info و Debug لا يتم كتابتهما على القرص في الوضع العادي، لذلك يمكن استخدامهما بكثرة دون خطر إبطاء التطبيق. يتم حفظ Error و Fault دائمًا، لكن يجب أن يكون عددهما ضئيلًا — كل رسالة من هذا النوع تزيد من وقت الكتابة بسبب البيانات الوصفية الإضافية.

الفئات و subsystem في os_log

Subsystem هو معرف تطبيق أو وحدة بتنسيق reverse-DNS (com.example.app). Category هي تسمية نصية داخل subsystem تجمع السجلات حسب المجالات الوظيفية: network و ui و database و auth. يتيح هذا التسلسل الهرمي تصفية السجلات دون قراءة كل رسالة وجمع إحصائيات لكل وحدة على حدة.

توصي Apple بتعريف OSLog واحد لكل وحدة واستخدامه في جميع ملفات تلك الوحدة. للطبقات المختلفة من التطبيق — networking و UI و persistence — يجب إنشاء فئات منفصلة. ثم في Console.app يمكن تمكين السجلات لـ network فقط وتعطيلها للباقي دون إعادة ترجمة التطبيق.

swift
import OSLog

extension Logger {
    static let network = Logger(
        subsystem: "com.example.app",
        category: "network"
    )
    static let ui = Logger(
        subsystem: "com.example.app",
        category: "ui"
    )
}

خصوصية البيانات في os_log

os_log توفر آلية تحكم مدمجة في الخصوصية: يمكن وضع علامة على كل قيمة في سلسلة التنسيق كـ public أو private أو auto (السلوك الافتراضي). افتراضيًا، تعتبر os_log جميع السلاسل الديناميكية والكائنات يحتمل أن تكون حساسة وتستبدلها بقناع <private> في سجلات الإنتاج.

هذا أمر بالغ الأهمية للامتثال لـ GDPR و HIPAA: إذا سجل التطبيق البريد الإلكتروني للمستخدم أو رقم البطاقة عبر os_log في الوضع التلقائي، فإن البيانات الفعلية لا تصل إلى القرص أبدًا. يرى المطور الرسالة الكاملة فقط عند الاتصال عبر Xcode أو عند استخدام ملف تعريف جمع من جهاز متصل بنفس Mac.

swift
let email = "user@example.com"
logger.log("User login: \(email, privacy: .public)")

// في سجلات الإنتاج: "User login: "
// في تصحيح الأخطاء عبر Xcode: "User login: user@example.com"
logger.log("Payment token: \(token)")

قواعد الخصوصية الافتراضية

الأرقام (Int و Double و Float) تعتبر عامة افتراضيًا — يمكن تسجيلها بأمان دون وضع علامة. السلاسل النصية (String و NSString و StaticString) و الكائنات (NSObject و CFType) خاصة افتراضيًا — يتم إخفاؤها في الإنتاج. السلاسل الثابتة (النصوص الحرفية بين علامتي اقتباس داخل سلسلة التنسيق) تكون مرئية دائمًا — إنها جزء من الرسالة نفسها، وليست بيانات.

يختلف هذا السلوك عن NSLog، حيث تم تسجيل جميع البيانات بنص واضح. الانتقال إلى os_log يقلل بشكل كبير من خطر تسرب بيانات المستخدم الحساسة من خلال السجلات.

os_log مقابل NSLog: مقارنة الأداء

os_log أسرع بنسبة 90–95% من NSLog عند التسجيل عالي التردد. في اختبار مع 10,000 استدعاء في حلقة، يخلق NSLog تأخيرًا يبلغ حوالي 2.8 ثانية، بينما يقوم os_log بنفس الاستدعاءات في 0.3 ثانية. يرجع الفرق إلى الكتابة المتزامنة على القرص في NSLog مقابل التخزين المؤقت غير المتزامن في os_log.

وفقًا لـ Apple Performance Lab (2016)، يفقد تطبيق iOS مع 20 استدعاء تسجيل في الثانية عبر NSLog من 5 إلى 8 إطارات رسوم متحركة في الثانية بسبب حظر الخيط الرئيسي. مع os_log لا يوجد فقدان للإطارات لأن التخزين المؤقت يحدث في خيط نواة منفصل.

المعاملNSLogos_log
آلية الكتابةكتابة متزامنة على القرصتخزين مؤقت غير متزامن في النواة
الوقت لـ 10,000 استدعاء~2.8 ث~0.3 ث
التأثير على FPSفقدان 5–8 إطارات0 إطار
مستويات الأهميةلا يوجد5 مستويات
الخصوصيةجميع البيانات مرئيةإخفاء تلقائي
التصفيةغير مدعومةحسب subsystem / category / level

أمثلة كود مع os_log بلغة Swift

os_log لها واجهتا برمجة تطبيقات: الكلاسيكية بلغة C os_log_create والغلاف الحديث لـ Swift Logger الذي تم تقديمه في iOS 14. يستخدم Logger في Swift نظام ResultBuilder للتنسيق — يتم استيفاء الوسائط من خلال السلاسل الحرفية مع وضع علامات خصوصية صريحة.

swift
import OSLog

let logger = Logger(
    subsystem: "com.example.app",
    category: "network"
)

func handleResponse(statusCode: Int) {
    if statusCode > 399 {
        logger.error("HTTP error: \(statusCode, privacy: .public)")
    } else {
        logger.info("Response OK: \(statusCode)")
    }
}

log collect هي أداة سطر أوامر لتصدير السجلات المجمعة من الجهاز. يتم تشغيلها من الطرفية بعد توصيل الجهاز بجهاز Mac عبر USB.

swift
// جمع السجلات في .logarchive
// في الطرفية: log collect --device --output ./app_logs.logarchive
// عرض سجلات subsystem: log show --subsystem com.example.app

// التسجيل بقيم ديناميكية
logger.log("User \(userId) opened screen \(screenName)")

عند استخدام Logger، من المهم تذكر أن الوسائط تُستوفى عبر String Interpolation، وليس عبر سلاسل التنسيق كما في إصدار C من os_log. هذا أكثر أمانًا، لكنه يتطلب وضع علامات خصوصية صريحة لكل وسيطة إذا كان السلوك الافتراضي لا يناسب المطور.

الأسئلة الشائعة

ما الفرق بين os_log و NSLog؟

يقوم os_log بتخزين الرسائل في المخزن بشكل غير متزامن في النواة ولا يحظر الخيط الرئيسي، بينما يكتب NSLog بشكل متزامن على القرص. os_log أسرع 10 مرات، ويوفر 5 مستويات من الأهمية، ويخفي البيانات الخاصة تلقائيًا — NSLog لا يمتلك أيًا من هذه الميزات.

ما مستوى os_log الذي يجب استخدامه لتصحيح الأخطاء؟

لرسائل تصحيح الأخطاء المؤقتة، استخدم .debug — يتم تعطيلها في إصدارات الإنتاج ولا تؤثر على أداء المستخدمين. للرسائل المهمة التي يجب الاحتفاظ بها دائمًا، استخدم .default أو .info.

كيف يمكن تمكين سجلات Info و Debug على جهاز المستخدم؟

من خلال Configure Profile في Xcode: Devices → اختر الجهاز → Open Console → Actions → Configure Profile. اضبط مستوى الجمع لـ subsystem المطلوب على Include. ينشئ هذا ملف تعريف يظل نشطًا حتى أول إعادة تشغيل للجهاز.

هل يمكن استخدام os_log في تطبيقات SwiftUI؟

نعم، os_log يعمل في جميع تطبيقات SwiftUI دون إعدادات إضافية. أنشئ Logger ثابتًا في النموذج الخاص بك أو في امتداد View واستخدمه في onChange و task ومعالجات الإيماءات لتتبع دورة حياة الشاشات.

لماذا يظهر os_log <private> بدلاً من القيم؟

افتراضيًا، يخفي os_log السلاسل والكائنات كخاصة. لرؤية القيمة، حدد صراحة privacy: .public في الاستيفاء. بدون هذه العلامة، ستستبدل القيم بالقناع في إصدارات الإنتاج، لكنها تظهر بشكل طبيعي في تصحيح الأخطاء عبر Xcode.

الخلاصة

  • os_log هي واجهة برمجة تطبيقات السجل الموحد من Apple والتي تعمل من خلال مخزن مؤقت دائري في نواة XNU مع كتابة غير متزامنة على القرص
  • الأداء — os_log أسرع 10 مرات من NSLog، ولا يحظر الخيط الرئيسي، ولا يؤثر على معدل إطارات الرسوم المتحركة بأي حجم تسجيل
  • المستويات — خمسة مستويات من Debug إلى Fault: يتم تعطيل Info و Debug في الإنتاج، ويتم حفظ Error و Fault دائمًا
  • Subsystem و Category — تسلسل هرمي لتجميع السجلات حسب وحدات التطبيق، والتصفية في Console.app دون قراءة كل رسالة
  • الخصوصية — إخفاء تلقائي للسلاسل والكائنات في سجلات الإنتاج، وحماية البيانات الشخصية دون كود إضافي
  • الأدوات — Console.app للعرض في الوقت الفعلي و log collect لتصدير أرشيف من الجهاز
  • الترحيل — استبدال NSLog بـ os_log يقلل من خطر تسرب البيانات ويحسن الأداء، خاصة في وحدات الشبكة عالية التحميل والعمليات الخلفية

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا