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 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.
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 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 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.
// OSLog orqali os_log e'lon qilish
import OSLog
let logger = Logger(
subsystem: "com.example.app",
category: "network"
)
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 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.
| Daraja | Ma'nosi | Odatiy buferga tushish |
|---|---|---|
| Default | Diagnostika uchun muhim oddiy xabarlar | Ha |
| Info | Batafsil tahlil uchun axborot xabarlari | Yo'q (faqat profil bilan) |
| Debug | Ishlab chiqish uchun disk raskadrovka xabarlari | Yo'q (faqat profil bilan) |
| Error | E'tibor talab qiladigan xatolar | Ha |
| Fault | Qulashga olib keladigan kritik nosozliklar | Ha |
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.
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.
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 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.
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)")
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 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.
| Parametr | NSLog | os_log |
|---|---|---|
| Yozish mexanizmi | Sinxron diskka yozish | Yadroda asinxron buferlash |
| 10 000 chaqiruvga vaqt | ~2.8 s | ~0.3 s |
| FPS ga ta'sir | 5–8 kadr yo'qotilishi | 0 kadr |
| Muhimlik darajalari | Yo'q | 5 daraja |
| Maxfiylik | Barcha ma'lumotlar ochiq | Avtomatik maskalash |
| Filtrlash | Qo'llab-quvvatlanmaydi | Subsystem / category / level bo'yicha |
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.
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.
// .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 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.
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.
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.
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.
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
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.