os_log: یہ کیا ہے، صلاحیتیں اور Apple میں یونیفائیڈ لاگنگ کا کام

مصنف: IT Sectr اشاعت: 2026-05-28 مطالعے کا وقت: 9 منٹ

os_log iOS اور macOS کے لیے Apple کا یونیفائیڈ لاگنگ API ہے جس نے NSLog اور os_trace کو بدل دیا۔ پرانے میکانزم کے برعکس، os_log کرنل کی سطح پر کام کرتا ہے: پیغامات رنگ بفر میں بفر ہوتے ہیں اور صرف سرگرمی کی حد تک پہنچنے پر ڈسک پر لکھے جاتے ہیں۔ Apple WWDC 2016 کے مطابق، os_log NSLog کے مقابلے میں ڈسک لوڈ کو 10 گنا کم کرتا ہے اور زمرہ جات اور اقسام کے ذریعے تفصیل کی سطح پر کنٹرول دیتا ہے۔ یہ iOS ڈویلپر کے لیے بنیادی تشخیصی ٹول ہے: Console.app کے ذریعے آپ ریئل ٹائم میں پیغامات کو پروسیس، زمرہ اور شدت کی سطح کے مطابق فلٹر کر سکتے ہیں۔

اہم نکات

  • os_log Apple کا سسٹم لاگنگ API ہے جو کرنل میں پیغامات کو بفر کرتا ہے اور NSLog کے مقابلے میں ڈسک لوڈ کو 90% تک کم کرتا ہے
  • سطحیں — Default، Info، Debug، Error، Fault — ہر ایک آزادانہ طور پر فلٹر ہوتی ہے اور لاگ اکٹھا کرنے کے پروفائل کے ذریعے فعال یا غیر فعال کی جا سکتی ہے
  • زمرہ جات — ایک ہی subsystem کے اندر سٹرنگ لیبل جو علیحدہ فائلیں بنائے بغیر لاگ کو ایپلیکیشن ماڈیولز کے مطابق گروپ کرنے کی اجازت دیتے ہیں
  • رازداری — os_log خود بخود اقتباس میں private کے طور پر نشان زد ڈیٹا کو ماسک کرتا ہے اور پروڈکشن لاگ میں انکرپٹ کرتا ہے
  • log collect — Console.app میں بعد میں تجزیہ کے لیے ڈیوائس سے اکٹھے کیے گئے لاگ ایکسپورٹ کرنے کی کمانڈ لائن یوٹیلیٹی

os_log کیا ہے

os_log ایک یونیفائیڈ لاگنگ API ہے جسے Apple نے iOS 10 اور macOS Sierra میں متعارف کرایا۔ اس نے بکھرے ہوئے لاگنگ میکانزم NSLog، os_trace اور syslog کو XNU کرنل کی سطح پر بفرنگ کے ساتھ ایک ہی نظام میں یکجا کر دیا۔

NSLog کے برعکس، جو ہر پیغام کو ہم وقت سازی سے ڈسک پر لکھتا ہے اور تھریڈ کو بلاک کرتا ہے، os_log میموری میں ایک غیر ہم وقت ساز رنگ بفر استعمال کرتا ہے۔ پیغامات صرف اس وقت ڈسک پر فلش ہوتے ہیں جب سرگرمی مقررہ حد سے بڑھ جائے یا log collect کمانڈ پر۔ یہ ایپلیکیشن کی کارکردگی پر لاگنگ کے اثرات کو یکسر کم کرتا ہے۔

os_log چھ شدت کی سطحوں، subsystem اور category کے لحاظ سے تفریق، اور ایک بلٹ ان رازداری میکانزم کو سپورٹ کرتا ہے: private کے طور پر نشان زد ڈیٹا پروڈکشن لاگ میں خود بخود ماسک ہو جاتا ہے اور صرف Xcode کے ذریعے منسلک ہونے پر ڈویلپر کے لیے دستیاب ہوتا ہے۔

یونیفائیڈ لاگنگ کی تاریخ

iOS 10 سے پہلے، ڈویلپرز ڈیبگنگ کے لیے NSLog اور سسٹم پیغامات کے لیے syslog استعمال کرتے تھے۔ NSLog stderr اور کنسول پر لکھتا تھا، لیکن انتہائی غیر موثر تھا: ہر پیغام ہم وقت سازی سے ڈسک پر لکھا جاتا تھا، جس سے بار بار لاگنگ پر یوزر انٹرفیس میں تاخیر ہوتی تھی۔ os_log نے بفرنگ کو XNU کرنل کے BSD حصے میں منتقل کر کے اور ڈسک رائٹ کو غیر ہم وقت ساز بنا کر اس مسئلے کو حل کیا۔

os_log کہاں استعمال ہوتا ہے

os_log تمام Apple ایپلیکیشنز میں استعمال ہوتا ہے اور Apple اسے iOS، macOS، tvOS اور watchOS کے لیے واحد لاگنگ API کے طور پر تجویز کرتا ہے۔ سسٹم اور تھرڈ پارٹی ایپلیکیشنز اس کے ذریعے ایک یونیفائیڈ ڈیٹابیس میں پیغامات لکھتی ہیں — یہ میموری میں محفوظ ہوتا ہے اور وقتاً فوقتاً ڈسک پر فلش ہوتا ہے۔ ان لاگ کا تجزیہ Mac پر Console.app کے ذریعے یا ٹرمینل میں log کمانڈ کے ذریعے کیا جا سکتا ہے۔

os_log کیسے کام کرتا ہے: فن تعمیر اور بفرنگ

os_log کا فن تعمیر تین تہوں پر مشتمل ہے: یوزر اسپیس میں کلائنٹ سائیڈ API (libsystem_trace.dylib)، XNU کرنل میں رنگ بفر، اور logd ڈیمون جو بفر کو غیر ہم وقت ساز طور پر ڈسک پر فلش کرتا ہے۔

جب کوئی ایپلیکیشن os_log کو کال کرتی ہے، تو پیغام کئی میگا بائٹ سائز کے کرنل رنگ بفر میں کاپی ہو جاتا ہے۔ بفر FIFO اصول پر کام کرتا ہے: اگر یہ بھر جاتا ہے تو پرانے پیغامات نئے پیغامات سے اوور رائٹ ہو جاتے ہیں۔ logd ڈیمون وقتاً فوقتاً بفر چیک کرتا ہے اور پیغامات کو فائل سسٹم کے محفوظ علاقے میں .tracev3 فائلوں میں محفوظ کرتا ہے۔

Apple Engineering کے مطابق، os_log کو کال کرنے سے لے کر Console.app میں پیغام ظاہر ہونے تک کی عام تاخیر ڈیوائس پر 1–5 سیکنڈ اور بیچ موڈ میں ڈسک پر فلش کرنے پر 60 سیکنڈ تک ہوتی ہے۔ یہ ایک جان بوجھ کر کیا گیا سمجھوتہ ہے: لاگنگ کی وجہ سے ایپلیکیشن کی کارکردگی متاثر نہیں ہوتی، لیکن ڈویلپر پیغامات کو تھوڑی تاخیر سے دیکھتا ہے۔

swift
// OSLog کے ذریعے os_log کا اعلان
import OSLog

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

رنگ بفر اور اس کی ترتیب

os_log کا رنگ بفر ایک مقررہ سائز کا ہوتا ہے اور اسے یوزر اسپیس سے تبدیل نہیں کیا جا سکتا۔ بفر کا سائز Apple Watch پر 256 KB سے لے کر Mac پر 4 MB تک ہوتا ہے۔ جب کوئی ایپلیکیشن بفر کی گنجائش سے زیادہ پیغامات پیدا کرتی ہے، تو پرانے پیغامات کھو جاتے ہیں — یہ زیادہ حجم والی لاگنگ کے لیے متوقع رویہ ہے۔

تمام پیغامات کے طویل مدتی اکٹھا کرنے کے لیے 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 ہمیشہ محفوظ ہوتے ہیں، لیکن ان کی تعداد کم سے کم ہونی چاہیے — ایسا ہر پیغام اضافی میٹا ڈیٹا کی وجہ سے لکھنے کا وقت بڑھاتا ہے۔

os_log میں زمرہ جات اور subsystem

Subsystem ریورس-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) ڈیفالٹ طور پر private ہیں — یہ پروڈکشن میں ماسک ہو جاتے ہیں۔ جامد سٹرنگز (فارمیٹ سٹرنگ کے اندر اقتباس میں سٹرنگ لٹرل) ہمیشہ دکھائی دیتی ہیں — یہ ڈیٹا نہیں بلکہ خود پیغام کا حصہ ہیں۔

یہ رویہ NSLog سے مختلف ہے، جہاں تمام ڈیٹا سادہ متن میں لاگ کیا جاتا تھا۔ os_log پر سوئچ کرنے سے لاگ کے ذریعے حساس صارف ڈیٹا کے لیک ہونے کا خطرہ نمایاں طور پر کم ہو جاتا ہے۔

os_log بمقابلہ NSLog: کارکردگی کا موازنہ

os_log زیادہ فریکوئنسی والی لاگنگ میں NSLog سے 90–95% تیز ہے۔ 10,000 کالز کے لوپ ٹیسٹ میں، NSLog تقریباً 2.8 سیکنڈ کی تاخیر پیدا کرتا ہے، جبکہ os_log اسی کالز کو 0.3 سیکنڈ میں انجام دیتا ہے۔ فرق os_log میں غیر ہم وقت ساز بفرنگ کے مقابلے NSLog میں ہم وقت ساز ڈسک رائٹ کی وجہ سے ہے۔

Apple Performance Lab (2016) کے مطابق، NSLog کے ذریعے فی سیکنڈ 20 لاگنگ کالز والی iOS ایپلیکیشن مین تھریڈ بلاک ہونے کی وجہ سے فی سیکنڈ 5–8 اینیمیشن فریم کھو دیتی ہے۔ os_log کے ساتھ کوئی فریم نقصان نہیں ہوتا کیونکہ بفرنگ ایک علیحدہ کرنل تھریڈ میں ہوتی ہے۔

پیرامیٹرNSLogos_log
لکھنے کا میکانزمہم وقت ساز ڈسک رائٹکرنل میں غیر ہم وقت ساز بفرنگ
10,000 کالز کا وقت~2.8 سیکنڈ~0.3 سیکنڈ
FPS پر اثر5–8 فریموں کا نقصان0 فریم
شدت کی سطحیںکوئی نہیں5 سطحیں
رازداریتمام ڈیٹا دکھائی دیتا ہےخودکار ماسکنگ
فلٹرنگتعاون یافتہ نہیںsubsystem / category / level کے مطابق

Swift میں os_log کے کوڈ کی مثالیں

os_log کے دو API ہیں: کلاسک C سٹائل os_log_create اور جدید Swift ریپر Logger جو iOS 14 میں متعارف کرایا گیا۔ Swift Logger فارمیٹنگ کے لیے 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 ایک کمانڈ لائن یوٹیلیٹی ہے جو ڈیوائس سے اکٹھے کیے گئے لاگ ایکسپورٹ کرنے کے لیے ہے۔ یہ USB کے ذریعے ڈیوائس کو Mac سے منسلک کرنے کے بعد ٹرمینل سے چلایا جاتا ہے۔

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 کے ذریعے انٹرپولیٹ ہوتے ہیں، نہ کہ فارمیٹ سٹرنگ کے ذریعے جیسا کہ os_log کے C ورژن میں ہوتا ہے۔ یہ زیادہ محفوظ ہے، لیکن ہر آرگیومنٹ کے لیے واضح رازداری کے نشان کی ضرورت ہوتی ہے اگر ڈیفالٹ رویہ ڈویلپر کے لیے موزوں نہ ہو۔

اکثر پوچھے جانے والے سوالات

os_log، NSLog سے کیسے مختلف ہے؟

os_log کرنل میں پیغامات کو غیر ہم وقت ساز طور پر بفر کرتا ہے اور مین تھریڈ کو بلاک نہیں کرتا، جبکہ NSLog ہم وقت ساز طور پر ڈسک پر لکھتا ہے۔ os_log 10 گنا تیز ہے، 5 شدت کی سطحیں فراہم کرتا ہے، اور خود بخود private ڈیٹا کو ماسک کرتا ہے — NSLog میں ان میں سے کوئی خصوصیت نہیں ہے۔

ڈیبگنگ کے لیے os_log کی کونسی سطح استعمال کرنی چاہیے؟

عارضی ڈیبگ پیغامات کے لیے، .debug استعمال کریں — یہ پروڈکشن بلڈ میں غیر فعال ہو جاتے ہیں اور صارفین کی کارکردگی کو متاثر نہیں کرتے۔ اہم پیغامات کے لیے جو ہمیشہ محفوظ رہنے چاہئیں، .default یا .info استعمال کریں۔

صارف کے ڈیوائس پر Info اور Debug لاگ کیسے فعال کریں؟

Xcode میں Configure Profile کے ذریعے: Devices → ڈیوائس منتخب کریں → Open Console → Actions → Configure Profile۔ مطلوبہ subsystem کے لیے اکٹھا کرنے کی سطح Include پر سیٹ کریں۔ یہ ایک پروفائل بناتا ہے جو ڈیوائس کے پہلے ری اسٹارٹ تک فعال رہتا ہے۔

کیا SwiftUI ایپلیکیشنز میں os_log استعمال کیا جا سکتا ہے؟

ہاں، os_log بغیر کسی اضافی سیٹ اپ کے تمام SwiftUI ایپلیکیشنز میں کام کرتا ہے۔ اپنے ماڈل میں یا View ایکسٹینشن میں ایک سٹیٹک Logger بنائیں اور اسکرین لائف سائیکل کو ٹریک کرنے کے لیے اسے onChange، task اور جیسچر ہینڈلرز میں استعمال کریں۔

os_log اقدار کی بجائے <private> کیوں دکھاتا ہے؟

ڈیفالٹ طور پر، os_log سٹرنگز اور آبجیکٹ کو private کے طور پر ماسک کرتا ہے۔ قدر دیکھنے کے لیے، انٹرپولیشن میں واضح طور پر privacy: .public بتائیں۔ اس نشان کے بغیر، اقدار پروڈکشن بلڈ میں ماسک سے بدل دی جائیں گی، لیکن Xcode ڈیبگنگ میں یہ عام طور پر دکھائی دیتی ہیں۔

خلاصہ

  • os_log Apple کا یونیفائیڈ لاگنگ API ہے جو غیر ہم وقت ساز ڈسک رائٹ کے ساتھ XNU کرنل میں رنگ بفر کے ذریعے کام کرتا ہے
  • کارکردگی — os_log، NSLog سے 10 گنا تیز ہے، مین تھریڈ کو بلاک نہیں کرتا، اور کسی بھی لاگنگ حجم پر اینیمیشن فریم ریٹ کو متاثر نہیں کرتا
  • سطحیں — Debug سے Fault تک پانچ سطحیں: Info اور Debug پروڈکشن میں غیر فعال ہوتی ہیں، Error اور Fault ہمیشہ محفوظ ہوتی ہیں
  • Subsystem اور Category — ایپلیکیشن ماڈیولز کے مطابق لاگ گروپ کرنے کے لیے ایک درجہ بندی، ہر پیغام کو پڑھے بغیر Console.app میں فلٹرنگ
  • رازداری — پروڈکشن لاگ میں سٹرنگز اور آبجیکٹ کا خودکار ماسکنگ، اضافی کوڈ کے بغیر ذاتی ڈیٹا کا تحفظ
  • ٹولز — ریئل ٹائم دیکھنے کے لیے Console.app اور ڈیوائس سے آرکائیو ایکسپورٹ کرنے کے لیے log collect
  • منتقلی — NSLog کو os_log سے بدلنے سے ڈیٹا لیک کا خطرہ کم ہوتا ہے اور کارکردگی بہتر ہوتی ہے، خاص طور پر بھاری لوڈ والے نیٹ ورک ماڈیولز اور بیک گراؤنڈ پروسیسز میں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں