Console di Xcode adalah alat debugging untuk pengembangan iOS yang menampilkan keluaran NSLog, print, os_log, dan crash log aplikasi secara real-time. Menurut Apple Unified Logging, sejak iOS 10 Apple merekomendasikan penggunaan os_log daripada NSLog untuk pengumpulan pesan terpusat melalui Unified Logging System. Console menggabungkan keluaran debugger dan pesan sistem dalam satu jendela Debug Area, yang tersedia setiap saat selama pengembangan.
Poin Utama
Console — bagian dari Debug Area di Xcode, terletak di panel bawah editor (View → Debug Area → Activate Console, pintasan Cmd + Shift + Y). Console menampilkan semua keluaran teks dari aplikasi yang berjalan: pesan dari NSLog, os_log, print, peringatan runtime, dan dump pengecualian otomatis saat aplikasi crash.
Console bekerja baik di simulator maupun di perangkat fisik. Di simulator, pesan tiba seketika melalui pipe lokal, di perangkat — melalui koneksi USB dengan penundaan 1–3 frame. Untuk aplikasi produksi, Console di perangkat tidak tersedia — pengembang mengandalkan Crashlytics atau Unified Logging dengan pengumpulan jarak jauh melalui log collect.
Tidak seperti aplikasi sistem Console.app di Mac, jendela Console di Xcode hanya menampilkan log dari aplikasi yang sedang berjalan (dengan kemampuan filter). Console.app mengumpulkan log dari semua proses di Mac, termasuk simulator iOS. Namun, untuk debugging aplikasi iOS, pengembang menggunakan Console Xcode bawaan karena integrasinya dengan debugger LLDB.
Tiga API utama tersedia bagi pengembang iOS untuk keluaran di Console: NSLog (usang), os_log (direkomendasikan), dan print (khusus Swift). Masing-masing memiliki karakteristik sendiri dalam hal kinerja, pemformatan, dan kompatibilitas dengan Unified Logging System.
NSLog — fungsi dari Foundation, tersedia di Objective-C dan Swift. NSLog mengeluarkan pesan dengan stempel waktu, nama proses, dan PID. Kekurangan: NSLog menulis ke buffer sistem secara sinkron, memblokir thread saat ini selama penulisan. Pada panggilan yang sering (misalnya dalam perulangan), NSLog menyebabkan penundaan yang terlihat. Apple tidak merekomendasikan NSLog untuk proyek baru, tetapi tetap kompatibel dengan kode lama dan pustaka pihak ketiga.
os_log — API dari os.framework, diperkenalkan di iOS 10. os_log bersifat asinkron: pesan ditempatkan dalam antrian dan ditulis ke buffer tanpa memblokir thread pemanggil. Menurut WWDC 2016, os_log 50 kali lebih cepat daripada NSLog dalam skenario beban tinggi. os_log juga mendukung manajemen dinamis: pesan level DEBUG hanya dikumpulkan di build Debug, di Release diabaikan tanpa biaya kinerja.
print() — metode keluaran paling sederhana di Swift. print menulis ke stdout (keluaran standar), yang diarahkan Xcode ke Console. print tidak menambahkan metadata (waktu, level), tetapi mendukung buffering stdout. Untuk debugging cepat, print adalah alat yang nyaman, tetapi untuk logging permanen, print kalah dari os_log dalam hal fungsionalitas dan kontrol.
import os.log
// NSLog — usang, memblokir
NSLog("Application started")
// os_log — direkomendasikan, asinkron
let log = OSLog(
subsystem: "com.myapp",
category: "lifecycle"
)
os_log("Application started", log: log)
// print — keluaran Swift cepat
print("Application started")
Unified Logging System (ULS) — infrastruktur logging komprehensif Apple, diperkenalkan di iOS 10 dan macOS Sierra. ULS mengumpulkan pesan dari semua proses sistem ke dalam satu penyimpanan dengan akses jarak jauh melalui alat baris perintah log di Mac. Pengembang menggunakan os_log untuk menulis ke ULS dan Console untuk membaca.
Setiap OSLog diidentifikasi oleh pasangan subsystem (misalnya, com.myapp.network) dan category (misalnya, http, websocket). Subsistem adalah domain aplikasi (satu aplikasi dapat memiliki beberapa subsistem untuk modul yang berbeda). Kategori adalah komponen di dalam subsistem. Kombinasi subsystem + category memungkinkan pemfilteran log yang fleksibel di Console dan log collect.
| Level | OSLogType | Tampilan di Console | Pengumpulan di Release |
|---|---|---|---|
| Default | .default | Selalu | Ya |
| Info | .info | Saat os_log UI diaktifkan | Ya |
| Debug | .debug | Hanya di build Debug | Tidak |
| Error | .error | Selalu dengan label merah | Ya |
| Fault | .fault | Selalu dengan label ungu | Ya |
Perintah log collect di Mac mengumpulkan log yang diarsipkan dari perangkat iOS yang terhubung ke file .logarchive. File ini dapat dibuka di Console.app di Mac untuk analisis mendetail, termasuk pesan os_log, crash log, dan diagnostik sistem. Untuk mengaktifkan pengumpulan di perangkat, Anda perlu mengaktifkan Developer Mode dan menghubungkan perangkat melalui USB.
Kerja praktis dengan Console mencakup tiga skenario utama: logging aktif selama pengembangan, analisis crash log setelah crash, dan diagnostik jarak jauh melalui .logarchive. Untuk setiap skenario, ada seperangkat alat dan pengaturan yang optimal.
Disarankan untuk membuat OSLog terpisah untuk setiap modul aplikasi dengan level: debug (debugging mendetail), info (transisi status utama), error (pengecualian dan kegagalan). Di Console Xcode, aktifkan filter berdasarkan subsistem aplikasi Anda untuk mengecualikan pesan sistem yang menciptakan kebisingan dan mengalihkan perhatian dari logika aplikasi.
Saat aplikasi crash, Xcode secara otomatis menghentikan eksekusi dan menampilkan thread tempat crash terjadi, dengan stack trace lengkap di Console. Baris pertama crash log berisi jenis pengecualian (NSException, EXC_BAD_ACCESS) dan penyebab (reason). Pelajari stack trace dari bawah ke atas: metode terakhir yang dipanggil adalah lokasi crash. Untuk alamat terenkripsi (di Release), diperlukan symbolication melalui dSYM.
// Contoh konfigurasi modular OSLog
extension OSLog {
static let uiLifecycle = OSLog(
subsystem: "com.myapp.ui",
category: "lifecycle"
)
static let network = OSLog(
subsystem: "com.myapp.network",
category: "http"
)
static let database = OSLog(
subsystem: "com.myapp.data",
category: "core-data"
)
}
// Penggunaan dengan level
os_log("View did load", log: .uiLifecycle, type: .debug)
os_log("HTTP 200 received", log: .network, type: .info)
os_log("Failed to save: \(error.localizedDescription)",
log: .database, type: .error)
Xcode Console mendukung beberapa fungsi lanjutan yang melampaui logging sederhana. Breakpoint log memungkinkan keluaran pesan di Console tanpa menghentikan eksekusi, dan perintah LLDB di Debugger Command memberikan kontrol penuh atas pemformatan keluaran.
Anda dapat mengatur breakpoint sehingga mengeluarkan pesan di Console dan secara otomatis melanjutkan eksekusi. Tempatkan breakpoint pada baris yang diinginkan, klik kanan → Edit Breakpoint → tambahkan Debugger Command: “po self” atau “expr @import UIKit” + Debugger Command: “po self.view”. Centang Automatically continue after evaluating. Setelah dijalankan, breakpoint akan menampilkan hasil perintah di Console setiap kali mencapai baris tersebut, tanpa mengganggu thread.
Console Xcode mendukung eksekusi perintah LLDB arbitrer selama berhenti di breakpoint. po (print object) menampilkan deskripsi objek, p (print) — nilai primitif, dan expr — mengeksekusi ekspresi Swift/ObjC. Untuk keluaran terformat, gunakan p/CGRectGetWidth. Keluaran LLDB ditampilkan di Console segera setelah mencapai breakpoint.
func processUserData(user: User) {
// Breakpoint di sini dengan Debugger Command:
// po "User name: \(user.name)"
// expr user.age = 30
print("Processing user: \(user.name)")
}
// Contoh logging kustom dengan urutan
func trackMethodCall(
file: String = #file,
function: String = #function
) {
os_log("[\(function)] called",
log: .uiLifecycle, type: .debug)
}
Console Xcode terintegrasi erat dengan Instruments — alat profiling Xcode. Saat menjalankan aplikasi melalui Product → Profile dengan template Logging, semua pesan os_log dicatat di trek Instruments dengan stempel waktu. Ini memungkinkan melihat log, kinerja, dan peristiwa sistem secara bersamaan pada satu skala waktu, yang penting untuk mendiagnosis race condition dan regresi kinerja.
Pertanyaan yang Sering Diajukan
NSLog — sinkron, memblokir thread, dan selalu mengeluarkan pesan. os_log — asinkron, 50 kali lebih cepat dalam skenario beban tinggi, mendukung kategori, dan penonaktifan dinamis level debug di build Release tanpa kehilangan kinerja.
Periksa level logging: secara default Console hanya menampilkan default ke atas. Untuk melihat info dan debug, buka menu os_log di Console Xcode dan pilih Include Info Messages dan Include Debug Messages, juga di pengaturan skema (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).
Pilih pesan yang diinginkan di Console, salin (Cmd + C), dan tempel di editor teks mana pun. Untuk dump lengkap, gunakan perintah terminal: sudo log collect --device --output /tmp/app_logs.logarchive — ini menyimpan semua log dari perangkat iOS dalam format terstruktur.
os_log tipe .default dan .error berfungsi di Release secara default. Untuk .info dan .debug di Release, Anda perlu menambahkan argumen peluncuran -OSLogPreferencesApp “$(PRODUCT_BUNDLE_IDENTIFIER):debug” di skema Xcode. Tanpa argumen ini, pesan debug tidak dikumpulkan di Release, yang menghemat sumber daya perangkat.
Buka Window → Organizer → Crashes di Xcode. Organizer menampilkan semua crash log yang dikumpulkan dari perangkat penguji, dikelompokkan berdasarkan jenis pengecualian. Untuk symbolication, diperlukan file .dSYM dari build tempat crash terjadi — Xcode secara otomatis menemukannya jika arsip tersedia.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga