os_log: bu nima, imkoniyatlari va Apple-da unified logging ishlashi

Muallif: IT Sectr Nashr etilgan: 2026-05-28 O'qish vaqti: 9 daq

os_log — Apple tomonidan iOS va macOS uchun taqdim etilgan unified logging API bo'lib, NSLog va os_trace o'rnini egallagan. Eski mexanizmlardan farqli o'laroq, os_log yadro darajasida ishlaydi: xabarlar halqa buferida buferlanadi va faqat faollik chegarasiga erishilganda diskka yoziladi. Apple WWDC 2016 ma'lumotlariga ko'ra, os_log disk yuklamasini NSLog bilan solishtirganda 10 baravar kamaytiradi va kategoriyalar va turlar orqali tafsilot darajasini nazorat qilish imkonini beradi. Bu iOS dasturchisi uchun asosiy diagnostika vositasidir: Console.app orqali xabarlarni jarayon, kategoriya va muhimlik darajasi bo'yicha real vaqtda filtrlash mumkin.

Asosiy ma'lumotlar

  • os_log — Apple tomonidan tizimli loglash API-si, xabarlarni yadroda buferlaydi va disk yuklamasini NSLog bilan solishtirganda 90% gacha kamaytiradi
  • Darajalar — Default, Info, Debug, Error, Fault — har biri mustaqil filtrlangan va log yig'ish profili orqali yoqilgan yoki o'chirilgan bo'lishi mumkin
  • Kategoriyalar — bitta subsystem ichidagi matn belgilari, alohida fayllar yaratmasdan loglarni dastur modullari bo'yicha guruhlash imkonini beradi
  • Maxfiylik — os_log private deb belgilangan qo'shtirnoq ichidagi ma'lumotlarni avtomatik maskalaydi va ularni ishlab chiqarish loglarida shifrlaydi
  • log collect — Console.app da keyingi tahlil uchun qurilmadan to'plangan loglarni eksport qilish uchun buyruq qatori utiliti

os_log nima

os_log — Apple tomonidan iOS 10 va macOS Sierra da taqdim etilgan unified logging API. U NSLog, os_trace va syslog ning tarqoq loglash mexanizmlarini XNU yadrosi darajasida buferlash bilan yagona tizimga birlashtirdi.

Har bir xabarni sinxron ravishda diskka yozadigan va oqimni bloklaydigan NSLog dan farqli o'laroq, os_log xotirada asinxron halqa buferidan foydalanadi. Xabarlar faqat faollik belgilangan chegaradan oshganda yoki log collect buyrug'i bilan diskka tashlanadi. Bu loglashning dastur samaradorligiga ta'sirini keskin kamaytiradi.

os_log oltita muhimlik darajasini, subsystem va category bo'yicha farqlashni, shuningdek o'rnatilgan maxfiylik mexanizmini qo'llab-quvvatlaydi: private deb belgilangan ma'lumotlar ishlab chiqarish loglarida avtomatik maskalanadi va faqat Xcode ulanganda dasturchi uchun mavjud bo'ladi.

Unified logging paydo bo'lish tarixi

iOS 10 dan oldin dasturchilar disk raskadrovka uchun NSLog va tizim xabarlari uchun syslog dan foydalanardilar. NSLog stderr va konsolga yozardi, lekin juda samarasiz edi: har bir xabar sinxron ravishda diskka yozilib, tez-tez loglashda UI da kechikishlarga sabab bo'lardi. os_log buferlashni XNU yadrosining BSD qismi darajasiga ko'chirib va diskka yozishni asinxron qilib, bu muammoni hal qildi.

os_log qayerda qo'llaniladi

os_log barcha Apple dasturlarida ishlatiladi va Apple tomonidan iOS, macOS, tvOS va watchOS uchun yagona loglash API si sifatida tavsiya etiladi. Tizim va uchinchi tomon dasturlari u orqali xabarlarni yagona ma'lumotlar bazasiga yozadilar — bu baza xotirada saqlanadi va vaqti-vaqti bilan diskka tashlanadi. Bu loglarni Mac da Console.app orqali yoki terminalda log buyrug'i bilan tahlil qilish mumkin.

os_log qanday ishlaydi: arxitektura va buferlash

os_log arxitekturasi uch qatlamdan iborat: foydalanuvchi fazosida mijoz API si (libsystem_trace.dylib), XNU yadrosida halqa buferi va buferni asinxron ravishda diskka tashlaydigan logd demoni.

Dastur os_log ni chaqirganda, xabar bir necha megabayt o'lchamdagi yadro halqa buferiga ko'chiriladi. Bufer FIFO printsipi bo'yicha ishlaydi: to'ldirilganda eski xabarlar yangilari bilan qayta yoziladi. logd demoni vaqti-vaqti bilan buferni tekshiradi va xabarlarni fayl tizimining himoyalangan sohasida .tracev3 fayllariga saqlaydi.

Apple Engineering ma'lumotlariga ko'ra, os_log chaqiruvidan Console.app da xabar paydo bo'lguncha odatiy kechikish qurilmada 1–5 soniya va paket rejimida diskka tashlashda 60 soniyagacha. Bu ongli kelishuv: dastur samaradorligi loglashdan aziyat chekmaydi, lekin dasturchi xabarlarni kichik kechikish bilan ko'radi.

swift
// OSLog orqali os_log e'lon qilish
import OSLog

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

Halqa buferi va uni sozlash

Halqa buferi os_log ning qat'iy hajmi bor va uni foydalanuvchi fazosidan o'zgartirib bo'lmaydi. Bufer hajmi Apple Watch da 256 KB dan Mac da 4 MB gacha o'zgaradi. Dastur bufer sig'imidan ko'proq xabar yaratganda, eski xabarlar yo'qoladi — bu yuqori hajmli loglash uchun kutilgan xatti-harakatdir.

Barcha xabarlarni uzoq muddatli yig'ish uchun log collect buyrug'i ishlatiladi, u qurilmada yig'ish demonini ishga tushiradi va .logarchive ni dasturchi kompyuteriga eksport qiladi. Bu rejimda bufer qayta yozilmaydi — xabarlar to'g'ridan-to'g'ri arxivga yoziladi.

os_log darajalari: Default, Info, Debug, Error, Fault

os_log besh muhimlik darajasini qo'llab-quvvatlaydi, ularning har biri alohida xabar turiga javob beradi va tizim tomonidan turlicha ishlanadi. Default darajasi — har doim buferga tushadigan xabarlar uchun asosiy daraja. Info va Debug yig'ish profilisisiz ishlab chiqarish versiyalarida o'chiriladi. Error va Fault har doim faol va ma'lumotlar bazasida maxsus bayroq bilan belgilanadi.

DarajaMa'nosiOdatiy buferga tushish
DefaultDiagnostika uchun muhim oddiy xabarlarHa
InfoBatafsil tahlil uchun axborot xabarlariYo'q (faqat profil bilan)
DebugIshlab chiqish uchun disk raskadrovka xabarlariYo'q (faqat profil bilan)
ErrorE'tibor talab qiladigan xatolarHa
FaultQulashga olib keladigan kritik nosozliklarHa

To'g'ri muhimlik darajasini tanlash samaradorlik uchun muhim: Info va Debug odatiy rejimda yozilmaydi diskka, shuning uchun ularni dasturni sekinlashtirish xavfisiz ko'p ishlatish mumkin. Error va Fault har doim saqlanadi, lekin ularning soni minimal bo'lishi kerak — har bunday xabar qo'shimcha metama'lumotlar tufayli yozish vaqtini oshiradi.

os_log da kategoriyalar va subsystem

Subsystem — dastur yoki modulning reverse-DNS formatidagi identifikatori (com.example.app). Category — subsystem ichidagi matn belgisi, loglarni funksional sohalar bo'yicha guruhlaydi: network, ui, database, auth. Bunday ierarxiya har bir xabarni o'qimasdan loglarni filtrlash va har bir modul uchun alohida statistika to'plash imkonini beradi.

Apple har bir modul uchun bitta OSLog belgilashni va uni ushbu modulning barcha fayllarida ishlatishni tavsiya qiladi. Dasturning turli qatlamlari uchun — networking, UI, persistence — alohida kategoriyalar yaratish kerak. U holda Console.app da faqat network uchun loglarni yoqish va qolganlarini o'chirish mumkin, dasturni qayta kompilyatsiya qilmasdan.

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 da ma'lumotlar maxfiyligi

os_log o'rnatilgan maxfiylikni nazorat qilish mexanizmini ta'minlaydi: formatlash satridagi har bir qiymat public, private yoki auto (odatiy xatti-harakat) deb belgilanishi mumkin. Odatiy bo'lib, os_log barcha dinamik satrlar va obyektlarni potentsial maxfiy deb hisoblaydi va ularni ishlab chiqarish loglarida <private> maskasi bilan almashtiradi.

Bu GDPR va HIPAA talablariga muvofiqlik uchun juda muhim: agar dastur foydalanuvchi elektron pochtasini yoki karta raqamini os_log orqali auto rejimida loglasa, haqiqiy ma'lumotlar hech qachon diskka tushmaydi. Dasturchi to'liq xabarni faqat Xcode orqali ulanganda yoki xuddi shu Mac ga ulangan qurilmadan yig'ish profilidan foydalanganda ko'radi.

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

// Ishlab chiqarish loglarida: "User login: <private>"
// Xcode orqali disk raskadrovkada: "User login: user@example.com"
logger.log("Payment token: \(token)")

Odatiy maxfiylik qoidalari

Raqamlar (Int, Double, Float) odatiy bo'lib public hisoblanadi — ularni belgilamasdan xavfsiz loglash mumkin. Satrlar (String, NSString, StaticString) va obyektlar (NSObject, CFType) odatiy bo'lib private — ishlab chiqarishda maskalanadi. Statik satrlar (format satridagi qo'shtirnoq ichidagi satr literallari) har doim ko'rinadi — bu ma'lumot emas, balki xabarning o'zining bir qismidir.

Bu xatti-harakat barcha ma'lumotlar ochiq loglanadigan NSLog dan farq qiladi. os_log ga o'tish loglar orqali nozik foydalanuvchi ma'lumotlarining sizib chiqishi xavfini sezilarli darajada kamaytiradi.

os_log vs NSLog: samaradorlik taqqoslash

os_log yuqori chastotali loglashda NSLog dan 90–95% tezroq. Siklda 10 000 chaqiruv testida NSLog taxminan 2.8 soniya kechikish yaratadi, os_log esa xuddi shu chaqiruvlarni 0.3 soniyada bajaradi. Farq NSLog da sinxron diskka yozish bilan os_log da asinxron buferlash o'rtasidagi farq bilan izohlanadi.

Apple Performance Lab (2016) ma'lumotlariga ko'ra, sekundiga 20 loglash chaqiruviga ega iOS dasturi NSLog orqali asosiy oqim bloklanishi sababli sekundiga 5–8 animatsiya kadrini yo'qotadi. os_log bilan kadr yo'qotilishi sodir bo'lmaydi, chunki buferlash alohida yadro oqimida amalga oshiriladi.

ParametrNSLogos_log
Yozish mexanizmiSinxron diskka yozishYadroda asinxron buferlash
10 000 chaqiruvga vaqt~2.8 s~0.3 s
FPS ga ta'sir5–8 kadr yo'qotilishi0 kadr
Muhimlik darajalariYo'q5 daraja
MaxfiylikBarcha ma'lumotlar ochiqAvtomatik maskalash
FiltrlashQo'llab-quvvatlanmaydiSubsystem / category / level bo'yicha

Swift da os_log bilan kod misollari

os_log ikkita API ga ega: klassik C os_log_create va iOS 14 da taqdim etilgan zamonaviy Swift o'rami Logger. Swift Logger formatlash uchun ResultBuilder tizimidan foydalanadi — argumentlar aniq maxfiylik belgisi bilan satr literallari orqali interpolyatsiya qilinadi.

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 — qurilmadan to'plangan loglarni eksport qilish uchun buyruq qatori utiliti. Qurilmani USB orqali Mac ga ulab, Terminaldan ishga tushiriladi.

swift
// .logarchive da loglarni yig'ish
// Terminalda: log collect --device --output ./app_logs.logarchive
// Subsystem loglarini ko'rish: log show --subsystem com.example.app

// Dinamik qiymatlar bilan loglash
logger.log("User \(userId) opened screen \(screenName)")

Logger dan foydalanganda, argumentlar C versiyasidagi kabi format satrlari orqali emas, balki String Interpolation orqali interpolyatsiya qilinishini yodda tutish kerak. Bu xavfsizroq, lekin agar odatiy xatti-harakat dasturchiga mos kelmasa, har bir argument uchun aniq privacy ko'rsatishni talab qiladi.

Tez-tez beriladigan savollar

os_log NSLog dan qanday farq qiladi?

os_log xabarlarni yadroda asinxron buferlaydi va asosiy oqimni bloklamaydi, NSLog esa sinxron ravishda diskka yozadi. os_log 10 baravar tezroq, 5 muhimlik darajasini beradi va shaxsiy ma'lumotlarni avtomatik maskalaydi — NSLog bu xususiyatlarning hech biriga ega emas.

Disk raskadrovka uchun os_log ning qaysi darajasidan foydalanish kerak?

Vaqtinchalik disk raskadrovka xabarlari uchun .debug dan foydalaning — ular ishlab chiqarish versiyasida o'chiriladi va foydalanuvchilarning samaradorligiga ta'sir qilmaydi. Har doim saqlanishi kerak bo'lgan muhim xabarlar uchun .default yoki .info dan foydalaning.

Foydalanuvchi qurilmasida Info va Debug loglarini qanday yoqish mumkin?

Xcode da Configure Profile orqali: Devices → qurilmani tanlang → Open Console → Actions → Configure Profile. Kerakli subsystem uchun yig'ish darajasini Include ga o'rnating. Bu qurilma birinchi qayta ishga tushirilgunga qadar faol bo'lgan profil yaratadi.

os_log ni SwiftUI dasturlarida ishlatish mumkinmi?

Ha, os_log qo'shimcha sozlamalarsiz barcha SwiftUI dasturlarida ishlaydi. Modelda yoki View kengaytmasida statik Logger yarating va ekranlarning hayot aylanishini kuzatish uchun onChange, task va jest handlerlarda foydalaning.

Nega os_log qiymatlar o'rniga <private> ko'rsatadi?

os_log odatiy bo'lib satrlar va obyektlarni private sifatida maskalaydi. Qiymatni ko'rish uchun interpolyatsiyada aniq privacy: .public belgilang. Bu belgisiz qiymatlar ishlab chiqarish versiyalarida maska bilan almashtiriladi, Xcode orqali disk raskadrovkada esa normal ko'rsatiladi.

Xulosa

  • os_log — XNU yadrosida halqa buferi orqali asinxron diskka yozish bilan ishlaydigan Apple unified logging API si
  • Samaradorlik — os_log NSLog dan 10 baravar tezroq, asosiy oqimni bloklamaydi va har qanday loglash hajmida animatsiya kadr tezligiga ta'sir qilmaydi
  • Darajalar — Debug dan Fault gacha besh daraja: Info va Debug ishlab chiqarishda o'chiriladi, Error va Fault har doim saqlanadi
  • Subsystem va Category — loglarni dastur modullari bo'yicha guruhlash uchun ierarxiya, Console.app da har bir xabarni o'qimasdan filtrlash
  • Maxfiylik — ishlab chiqarish loglarida satrlar va obyektlarning avtomatik maskalanishi, qo'shimcha kodsiz shaxsiy ma'lumotlarni himoya qilish
  • Asboblar — real vaqtda ko'rish uchun Console.app va qurilmadan arxiv eksporti uchun log collect
  • Migratsiya — NSLog ni os_log bilan almashtirish ma'lumot sizib chiqishi xavfini kamaytiradi va samaradorlikni yaxshilaydi, ayniqsa yuklangan tarmoq modullarida va fon jarayonlarida

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing