
Xcglogger adalah modul log debug asli untuk digunakan dalam proyek Swift.
Swift tidak termasuk preprocessor C sehingga pengembang tidak dapat menggunakan log debug #define makro yang akan mereka gunakan di Objective-C. Ini berarti cara tradisional kami untuk menghasilkan log debug yang bagus tidak lagi berfungsi. Menggunakan panggilan print lama yang biasa berarti Anda kehilangan banyak informasi yang bermanfaat, atau mengharuskan Anda mengetik lebih banyak kode.
Xcglogger memungkinkan Anda untuk mencatat detail ke konsol (dan secara opsional sebuah file, atau tujuan khusus lainnya), seperti yang Anda miliki dengan NSLog() atau print() , tetapi dengan informasi tambahan, seperti tanggal, nama fungsi, nama file, dan nomor baris.
Pergi dari ini:
Simple message
untuk ini:
2014-06-09 06:44:43.600 [Debug] [AppDelegate.swift:40] application(_:didFinishLaunchingWithOptions:): Simple message
Menjalankan:
git submodule add https://github.com/DaveWoodCom/XCGLogger.git
di folder repositori Anda.
Tambahkan baris berikut ke Cartfile Anda.
github "DaveWoodCom/XCGLogger" ~> 7.1.5
Kemudian jalankan carthage update --no-use-binaries atau hanya carthage update . Untuk perincian pemasangan dan penggunaan Carthage, kunjungi halaman proyeknya.
Pengembang yang menjalankan 5.0 dan di atas di Swift perlu menambahkan $(SRCROOT)/Carthage/Build/iOS/ObjcExceptionBridging.framework ke file input mereka dalam fase pembuatan kerangka kerja carthage.
Tambahkan sesuatu yang mirip dengan baris berikut ke Podfile Anda. Anda mungkin perlu menyesuaikan berdasarkan platform Anda, versi/cabang dll.
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '12.0'
use_frameworks!
pod 'XCGLogger', '~> 7.1.5'
Menentukan Pod XCGLogger sendiri akan mencakup kerangka kerja inti. Kami mulai menambahkan subspec untuk memungkinkan Anda memasukkan komponen opsional juga:
pod 'XCGLogger/UserInfoHelpers', '~> 7.1.5' : Sertakan beberapa kode eksperimental untuk membantu menangani menggunakan kamus UserInfo untuk menandai pesan log.
Kemudian jalankan pod install . Untuk perincian instalasi dan penggunaan cocoapods, kunjungi situs web resminya.
Catatan: Sebelum Cocoapods 1.4.0 tidak mungkin menggunakan beberapa polong dengan campuran versi Swift. Anda mungkin perlu memastikan setiap pod dikonfigurasi untuk versi Swift yang benar (periksa target dalam proyek pod ruang kerja Anda). Jika Anda secara manual menyesuaikan versi Swift untuk suatu proyek, itu akan mengatur ulang saat berikutnya Anda menjalankan pod install . Anda dapat menambahkan kait post_install ke podfile Anda untuk mengotomatiskan pengaturan versi Swift yang benar. Ini sebagian besar belum teruji, dan saya tidak yakin itu solusi yang bagus, tetapi tampaknya berhasil:
post_install do |installer|
installer.pods_project.targets.each do |target|
if ['SomeTarget-iOS', 'SomeTarget-watchOS'].include? "#{target}"
print "Setting #{target}'s SWIFT_VERSION to 4.2n"
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.2'
end
else
print "Setting #{target}'s SWIFT_VERSION to Undefined (Xcode will automatically resolve)n"
target.build_configurations.each do |config|
config.build_settings.delete('SWIFT_VERSION')
end
end
end
print "Setting the default SWIFT_VERSION to 3.2n"
installer.pods_project.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
Anda dapat menyesuaikannya agar sesuai dengan kebutuhan Anda.
Tambahkan entri berikut ke dependensi paket Anda:
.Package(url: "https://github.com/DaveWoodCom/XCGLogger.git", majorVersion: 7)
Menggunakan:
Metode start cepat ini dimaksudkan hanya untuk membuat Anda bangun dan berjalan dengan logger. Namun Anda harus menggunakan penggunaan lanjutan di bawah ini untuk mendapatkan hasil maksimal dari perpustakaan ini.
Tambahkan Proyek Xcglogger sebagai subproyject ke proyek Anda, dan tambahkan pustaka yang sesuai sebagai ketergantungan target Anda. Di bawah tab General target Anda, tambahkan XCGLogger.framework dan ObjcExceptionBridging.framework ke bagian Embedded Binaries .
Kemudian, di setiap file sumber:
import XCGLoggerDi AppDelegate Anda (atau file global lainnya), nyatakan konstanta global ke instance Xcglogger default.
let log = XCGLogger . defaultDi
application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplicationLaunchOptionsKey : Any ] ? = nil ) // iOS, tvOSatau
applicationDidFinishLaunching ( _ notification : Notification ) // macOSfungsi, konfigurasikan opsi yang Anda butuhkan:
log . setup ( level : . debug , showThreadName : true , showLevel : true , showFileNames : true , showLineNumbers : true , writeToFile : " path/to/file " , fileLevel : . debug ) Nilai untuk writeToFile: bisa berupa String atau URL . Jika file sudah ada, itu akan dihapus sebelum kita menggunakannya. Hilangkan parameter atau atur ke nil untuk masuk ke konsol saja. Anda secara opsional dapat mengatur level log yang berbeda untuk output file menggunakan parameter fileLevel: Atur ke nil atau hilangkan untuk menggunakan level log yang sama dengan konsol.
Lalu, kapan pun Anda ingin mencatat sesuatu, gunakan salah satu metode kenyamanan:
log . verbose ( " A verbose message, usually useful when working on a specific problem " )
log . debug ( " A debug message " )
log . info ( " An info message, probably useful to power users looking in console.app " )
log . notice ( " A notice message " )
log . warning ( " A warning message, may indicate a possible error " )
log . error ( " An error occurred, but it's recoverable, just info about what happened " )
log . severe ( " A severe error occurred, we are likely about to crash now " )
log . alert ( " An alert error occurred, a log destination could be made to email someone " )
log . emergency ( " An emergency error occurred, a log destination could be made to text someone " ) Metode yang berbeda mengatur level log pesan. Xcglogger hanya akan mencetak pesan dengan level log yang lebih besar atau sama dengan pengaturan level log saat ini. Jadi logger dengan tingkat .error hanya akan mengeluarkan pesan log dengan tingkat .error , .severe , .alert , atau .emergency .
Xcglogger bertujuan untuk menjadi mudah digunakan dan membuat Anda naik dan berjalan dengan cepat dengan sedikitnya 2 baris kode di atas. Tetapi memungkinkan untuk kontrol dan fleksibilitas yang jauh lebih besar.
Logger dapat dikonfigurasi untuk mengirimkan pesan log ke berbagai tujuan. Menggunakan pengaturan dasar di atas, logger akan mengeluarkan pesan log ke konsol debug xcode standar, dan secara opsional file jika jalur disediakan. Sangat mungkin Anda ingin mengirim log ke tempat yang lebih menarik, seperti konsol sistem Apple, database, server pihak ketiga, atau aplikasi lain seperti NSLogger. Ini dilakukan dengan menambahkan tujuan ke logger.
Berikut adalah contoh mengkonfigurasi logger ke output ke log sistem apel serta file.
// Create a logger object with no destinations
let log = XCGLogger ( identifier : " advancedLogger " , includeDefaultDestinations : false )
// Create a destination for the system console log (via NSLog)
let systemDestination = AppleSystemLogDestination ( identifier : " advancedLogger.systemDestination " )
// Optionally set some configuration options
systemDestination . outputLevel = . debug
systemDestination . showLogIdentifier = false
systemDestination . showFunctionName = true
systemDestination . showThreadName = true
systemDestination . showLevel = true
systemDestination . showFileName = true
systemDestination . showLineNumber = true
systemDestination . showDate = true
// Add the destination to the logger
log . add ( destination : systemDestination )
// Create a file log destination
let fileDestination = FileDestination ( writeToFile : " /path/to/file " , identifier : " advancedLogger.fileDestination " )
// Optionally set some configuration options
fileDestination . outputLevel = . debug
fileDestination . showLogIdentifier = false
fileDestination . showFunctionName = true
fileDestination . showThreadName = true
fileDestination . showLevel = true
fileDestination . showFileName = true
fileDestination . showLineNumber = true
fileDestination . showDate = true
// Process this destination in the background
fileDestination . logQueue = XCGLogger . logQueue
// Add the destination to the logger
log . add ( destination : fileDestination )
// Add basic app info, version info etc, to the start of the logs
log . logAppDetails ( )Anda dapat mengonfigurasi setiap tujuan log dengan opsi yang berbeda tergantung pada kebutuhan Anda.
Pola penggunaan umum lainnya adalah memiliki banyak penebang, mungkin satu untuk masalah UI, satu untuk jaringan, dan satu lagi untuk masalah data.
Setiap tujuan log dapat memiliki level log sendiri. Sebagai kenyamanan, Anda dapat mengatur level log pada objek log itu sendiri dan akan melewati level itu ke setiap tujuan. Kemudian atur tujuan yang perlu berbeda.
Catatan : Objek tujuan hanya dapat ditambahkan ke satu objek Logger, menambahkannya ke satu detik akan menghapusnya dari yang pertama.
Atau Anda dapat menggunakan penutupan untuk menginisialisasi variabel global Anda, sehingga semua inisialisasi dilakukan di satu tempat
let log : XCGLogger = {
let log = XCGLogger ( identifier : " advancedLogger " , includeDefaultDestinations : false )
// Customize as needed
return log
} ( ) Catatan : Ini membuat objek log dengan malas, yang berarti tidak dibuat sampai benar -benar dibutuhkan. Ini menunda output awal dari detail informasi aplikasi. Karena itu, saya sarankan memaksa objek log untuk dibuat pada peluncuran aplikasi dengan menambahkan garis let _ = log di bagian atas metode didFinishLaunching Anda jika Anda belum mencatat sesuatu pada peluncuran aplikasi.
Anda dapat mencatat string:
log . debug ( " Hi there! " )atau hampir semua yang Anda inginkan:
log . debug ( true )
log . debug ( CGPoint ( x : 1.1 , y : 2.2 ) )
log . debug ( MyEnum . Option )
log . debug ( ( 4 , 2 ) )
log . debug ( [ " Device " : " iPhone " , " Version " : 7 ] ) Baru di Xcglogger 4, Anda sekarang dapat membuat filter untuk diterapkan pada logger Anda (atau ke tujuan tertentu). Buat dan konfigurasikan filter Anda (contoh di bawah), dan kemudian tambahkan ke objek logger atau tujuan dengan mengatur properti filters opsional ke array yang berisi filter. Filter diterapkan dalam urutan yang ada di array. Selama pemrosesan, setiap filter ditanya apakah pesan log harus dikecualikan dari log. Jika ada filter yang mengecualikan pesan log, itu dikecualikan. Filter tidak memiliki cara untuk membalikkan pengecualian filter lain.
Jika properti filters tujuan adalah nil , properti filters log digunakan sebagai gantinya. Untuk memiliki satu tujuan log semuanya, sambil memiliki semua tujuan lain memfilter sesuatu, tambahkan filter ke objek log dan atur properti filters satu tujuan ke array kosong [] .
Catatan : Tidak seperti tujuan, Anda dapat menambahkan objek filter yang sama ke beberapa penebang dan/atau beberapa tujuan.
Untuk mengecualikan semua pesan log dari file tertentu, buat filter pengecualian seperti itu:
log . filters = [ FileNameFilter ( excludeFrom : [ " AppDelegate.swift " ] , excludePathWhenMatching : true ) ] excludeFrom: Mengambil Array<String> atau Set<String> sehingga Anda dapat menentukan beberapa file secara bersamaan.
excludePathWhenMatching: Default ke true sehingga Anda dapat menghilangkannya kecuali Anda ingin mencocokkan Path juga.
Untuk memasukkan pesan log hanya untuk set spesifik ke file, buat filter menggunakan includeFrom: initializer. Dimungkinkan juga untuk hanya mengubah properti inverse untuk membalikkan filter pengecualian ke filter inklusi.
Untuk memfilter pesan log dengan tag, tentu saja Anda harus dapat mengatur tag pada pesan log. Setiap pesan log sekarang dapat memiliki data tambahan yang ditentukan pengguna yang dilampirkan, untuk digunakan oleh filter (dan/atau format, dll). Ini ditangani dengan Objek userInfo: Dictionary<String, Any> . Kunci kamus harus menjadi string namespaced untuk menghindari tabrakan dengan penambahan di masa depan. Kunci resmi akan dimulai dengan com.cerebralgardens.xcglogger . Kunci tag dapat diakses oleh XCGLogger.Constants.userInfoKeyTags . Anda pasti tidak ingin mengetiknya, jadi jangan ragu untuk membuat jalan pintas global: let tags = XCGLogger.Constants.userInfoKeyTags . Sekarang Anda dapat dengan mudah menandai log Anda:
let sensitiveTag = " Sensitive "
log . debug ( " A tagged log message " , userInfo : [ tags : sensitiveTag ] ) Nilai untuk tag dapat berupa Array<String> , Set<String> , atau hanya String , tergantung pada kebutuhan Anda. Mereka semua akan bekerja dengan cara yang sama saat difilter.
Bergantung pada alur kerja dan penggunaan Anda, Anda mungkin akan membuat metode yang lebih cepat untuk mengatur kamus userInfo . Lihat di bawah untuk cara pintas lain yang mungkin.
Sekarang setelah log Anda ditandai, Anda dapat memfilter dengan mudah:
log . filters = [ TagFilter ( excludeFrom : [ sensitiveTag ] ) ] Sama seperti FileNameFilter , Anda dapat menggunakan includeFrom: atau beralih inverse untuk memasukkan hanya pesan log yang memiliki tag yang ditentukan.
Penyaringan oleh pengembang persis seperti penyaringan dengan tag, hanya menggunakan kunci userInfo dari XCGLogger.Constants.userInfoKeyDevs . Faktanya, kedua filter adalah subclass dari kelas UserInfoFilter yang dapat Anda gunakan untuk membuat filter tambahan. Lihat Memperluas Xcglogger di bawah ini.
Dalam proyek besar dengan banyak pengembang, Anda mungkin ingin mulai menandai pesan log, serta menunjukkan pengembang yang menambahkan pesan.
Meskipun sangat fleksibel, kamus userInfo bisa sedikit rumit untuk digunakan. Ada beberapa metode yang mungkin yang dapat Anda gunakan hanya untuk hal -hal. Saya masih menguji ini sendiri sehingga mereka belum secara resmi bagian dari perpustakaan (saya ingin umpan balik atau saran lainnya).
Saya telah membuat beberapa kode eksperimental untuk membantu membuat kamus UserInfo. (Sertakan subspec UserInfoHelpers opsional jika menggunakan cocoapods). Periksa aplikasi demo iOS untuk melihatnya digunakan.
Ada dua struktur yang sesuai dengan protokol UserInfoTaggingProtocol . Tag dan Dev .
Anda dapat membuat ekstensi pada masing -masing yang sesuai dengan proyek Anda. Misalnya:
extension Tag {
static let sensitive = Tag ( " sensitive " )
static let ui = Tag ( " ui " )
static let data = Tag ( " data " )
}
extension Dev {
static let dave = Dev ( " dave " )
static let sabby = Dev ( " sabby " )
} Seiring dengan tipe ini, ada operator yang kelebihan beban | Itu dapat digunakan untuk menggabungkannya menjadi kamus yang kompatibel dengan UserInfo: parameter panggilan logging.
Maka Anda dapat mencatat pesan seperti ini:
log . debug ( " A tagged log message " , userInfo : Dev . dave | Tag . sensitive ) Ada beberapa masalah saat ini yang saya lihat dengan UserInfoHelpers ini, itulah sebabnya saya membuatnya opsional/eksperimental untuk saat ini. Saya ingin mendengar komentar/saran untuk perbaikan.
| Gabungan Kamus asalkan tidak ada Set S. Jika salah satu kamus berisi satu Set , itu akan menggunakan salah satunya, tanpa menggabungkannya. Lebih suka sisi kiri jika kedua sisi memiliki set untuk kunci yang sama.userInfo: membutuhkan kamus, Anda tidak dapat meneruskan satu dev atau objek tag. Anda perlu menggunakan setidaknya dua dengan | operator untuk membuatnya secara otomatis dikonversi ke kamus yang kompatibel. Jika Anda hanya ingin satu tag misalnya, Anda harus mengakses parameter .dictionary secara manual: userInfo: Tag("Blah").dictionary . Semua metode log beroperasi pada penutupan. Menggunakan gula sintaksis yang sama dengan fungsi SWIFT assert() , pendekatan ini memastikan kami tidak menyia -nyiakan sumber daya membangun pesan log yang tidak akan menjadi output, sementara pada saat yang sama melestarikan situs panggilan bersih.
Misalnya, pernyataan log berikut tidak akan menyia -nyiakan sumber daya jika level log debug ditekan:
log . debug ( " The description of ( thisObject ) is really expensive to create " ) Demikian pula, katakanlah Anda harus beralih melalui loop untuk melakukan beberapa perhitungan sebelum mencatat hasilnya. Di Objective-C, Anda dapat meletakkan blok kode itu antara #if #endif , dan mencegah kode berjalan. Namun dalam Swift, sebelumnya Anda harus tetap memproses loop itu, membuang -buang sumber daya. Dengan XCGLogger sesederhana:
log . debug {
var total = 0.0
for receipt in receipts {
total += receipt . total
}
return " Total of all receipts: ( total ) "
} Dalam kasus di mana Anda ingin secara selektif menjalankan kode tanpa menghasilkan baris log, mengembalikan nil , atau menggunakan salah satu metode: verboseExec , debugExec , infoExec , warningExec , errorExec , dan severeExec .
Anda dapat membuat objek DateFormatter Anda sendiri dan menetapkannya ke Logger.
let dateFormatter = DateFormatter ( )
dateFormatter . dateFormat = " MM/dd/yyyy hh:mma "
dateFormatter . locale = Locale . current
log . dateFormatter = dateFormatterXcglogger mendukung penambahan kode pemformatan ke pesan log Anda untuk memungkinkan warna di berbagai tempat. Opsi asli adalah menggunakan plug-in Xcodecolors. Namun, Xcode (pada versi 8) tidak lagi secara resmi mendukung plug-in. Anda masih dapat melihat log log Anda, hanya saja tidak di Xcode saat ini. Anda dapat menggunakan Dukungan Warna ANSI untuk menambah warna ke objek file Anda dan melihat log Anda melalui jendela terminal. Ini memberi Anda beberapa opsi tambahan seperti menambahkan tebal, miring, atau (tolong jangan) berkedip!
Setelah diaktifkan, setiap level log dapat memiliki warnanya sendiri. Warna -warna ini dapat disesuaikan sesuai keinginan. Jika menggunakan beberapa logger, Anda dapat mengatur setiap logger ke warnanya sendiri.
Contoh pengaturan formatter ANSI:
if let fileDestination : FileDestination = log . destination ( withIdentifier : XCGLogger . Constants . fileDestinationIdentifier ) as? FileDestination {
let ansiColorLogFormatter : ANSIColorLogFormatter = ANSIColorLogFormatter ( )
ansiColorLogFormatter . colorize ( level : . verbose , with : . colorIndex ( number : 244 ) , options : [ . faint ] )
ansiColorLogFormatter . colorize ( level : . debug , with : . black )
ansiColorLogFormatter . colorize ( level : . info , with : . blue , options : [ . underline ] )
ansiColorLogFormatter . colorize ( level : . notice , with : . green , options : [ . italic ] )
ansiColorLogFormatter . colorize ( level : . warning , with : . red , options : [ . faint ] )
ansiColorLogFormatter . colorize ( level : . error , with : . red , options : [ . bold ] )
ansiColorLogFormatter . colorize ( level : . severe , with : . white , on : . red )
ansiColorLogFormatter . colorize ( level : . alert , with : . white , on : . red , options : [ . bold ] )
ansiColorLogFormatter . colorize ( level : . emergency , with : . white , on : . red , options : [ . bold , . blink ] )
fileDestination . formatters = [ ansiColorLogFormatter ]
} Seperti halnya filter, Anda dapat menggunakan objek formatter yang sama untuk beberapa penebang dan/atau beberapa tujuan. Jika properti formatters suatu tujuan adalah nil , properti formatters logger akan digunakan sebagai gantinya.
Lihat Memperluas Xcglogger di bawah ini untuk info tentang membuat format kustom Anda sendiri.
Dengan menggunakan bendera SWIFT Build, level log yang berbeda dapat digunakan dalam debugging versus pementasan/produksi. Buka Pengaturan Bangun -> Swift Compiler -Bendera Kustom -> Bendera Swift Lainnya dan Tambah -DDEBUG ke entri Debug.
#if DEBUG
log . setup ( level : . debug , showThreadName : true , showLevel : true , showFileNames : true , showLineNumbers : true )
#else
log . setup ( level : . severe , showThreadName : true , showLevel : true , showFileNames : true , showLineNumbers : true )
#endif Anda dapat mengatur sejumlah opsi dengan cara yang sama. Lihat aplikasi iOSDemo yang diperbarui untuk contoh menggunakan berbagai tujuan log berdasarkan opsi, cari USE_NSLOG .
Secara default, tujuan log yang disediakan akan memproses log pada utas yang dipanggil. Ini untuk memastikan pesan log ditampilkan segera saat men -debug aplikasi. Anda dapat menambahkan breakpoint segera setelah panggilan log dan melihat hasilnya saat breakpoint menyala.
Namun, jika Anda tidak secara aktif men -debug aplikasi, memproses log pada utas saat ini dapat memperkenalkan hit kinerja. Anda sekarang dapat menentukan proses tujuan lognya pada antrian pengiriman pilihan Anda (atau bahkan menggunakan yang disediakan default).
fileDestination . logQueue = XCGLogger . logQueueatau bahkan
fileDestination . logQueue = DispatchQueue . global ( qos : . background )Ini bekerja sangat baik ketika dikombinasikan dengan metode konfigurasi alternatif di atas.
#if DEBUG
log . setup ( level : . debug , showThreadName : true , showLevel : true , showFileNames : true , showLineNumbers : true )
#else
log . setup ( level : . severe , showThreadName : true , showLevel : true , showFileNames : true , showLineNumbers : true )
if let consoleLog = log . logDestination ( XCGLogger . Constants . baseConsoleDestinationIdentifier ) as? ConsoleDestination {
consoleLog . logQueue = XCGLogger . logQueue
}
#endifSaat menggunakan konfigurasi lanjutan dari logger (lihat penggunaan lanjutan di atas), Anda sekarang dapat menentukan bahwa logger ditambahkan ke file log yang ada, alih -alih secara otomatis menimpa.
Tambahkan Opsional shouldAppend: Parameter Saat Menginisialisasi Objek FileDestination . Anda juga dapat menambahkan Parameter appendMarker: untuk menambahkan penanda ke file log yang menunjukkan di mana instance baru dari aplikasi Anda mulai ditambahkan. Secara default kami akan menambahkan -- ** ** ** -- Jika parameter dihilangkan. Atur ke nil untuk melewatkan menambahkan penanda.
let fileDestination = FileDestination(writeToFile: "/path/to/file", identifier: "advancedLogger.fileDestination", shouldAppend: true, appendMarker: "-- Relauched App --")
Saat masuk ke file, Anda memiliki opsi untuk secara otomatis memutar file log ke tujuan yang diarsipkan, dan meminta logger secara otomatis membuat file log baru sebagai pengganti yang lama.
Buat tujuan menggunakan kelas AutoRotatingFileDestination dan atur properti berikut:
targetMaxFileSize : Rotate Otomatis Setelah file lebih besar dari ini
targetMaxTimeInterval : Auto Rotate setelah ini beberapa detik
targetMaxLogFiles : Jumlah file log yang diarsipkan untuk disimpan, yang lebih lama secara otomatis dihapus
Itu semua adalah pedoman untuk pencatat, bukan batasan yang sulit.
Anda dapat membuat tujuan log alternatif (selain yang dibangun). Tujuan log khusus Anda harus mengimplementasikan protokol DestinationProtocol . Instantiate objek Anda, konfigurasikan, dan kemudian tambahkan ke objek XCGLogger dengan add(destination:) . Ada dua kelas tujuan dasar ( BaseDestination dan BaseQueuedDestination ) yang dapat Anda warisi untuk menangani sebagian besar proses untuk Anda, mengharuskan Anda untuk hanya menerapkan satu metode tambahan di kelas khusus Anda. Lihatlah ConsoleDestination dan FileDestination contoh.
Anda juga dapat membuat filter atau format kustom. Lihatlah versi yang disediakan sebagai titik awal. Perhatikan bahwa filter dan format memiliki kemampuan untuk mengubah pesan log saat diproses. Ini berarti Anda dapat membuat filter yang strip kata sandi, menyoroti kata -kata tertentu, mengenkripsi pesan, dll.
Xcglogger adalah pencatat terbaik yang tersedia untuk Swift karena kontribusi dari komunitas seperti Anda. Ada banyak cara Anda dapat membantu terus membuatnya hebat.
Catatan : Saat mengirimkan permintaan tarik, silakan gunakan banyak ayat komit komitmen kecil. Itu membuatnya lebih mudah untuk bergabung ketika ada beberapa permintaan tarik yang perlu digabungkan untuk versi baru.
Jika Anda menemukan perpustakaan ini bermanfaat, Anda pasti akan menemukan alat lain ini bermanfaat:
Watchdog: https://watchdogforxcode.com/
Juga, silakan periksa beberapa proyek saya yang lain:
Log perubahan sekarang dalam file sendiri: changelog.md