
XcGlogger هي وحدة سجل التصحيح الأصلي للاستخدام في المشاريع السريعة.
لا تتضمن SWIFT معالجًا مسبقًا C ، لذا لا يستطيع المطورون استخدام سجلات تصحيح الأخطاء #define وحدات الماكرو التي سيستخدمونها في Objective-C. هذا يعني أن طريقتنا التقليدية لتوليد سجلات تصحيح لطيفة لم تعد تعمل. إن اللجوء إلى مكالمات print القديمة البسيطة يعني أنك تفقد الكثير من المعلومات المفيدة ، أو تتطلب منك كتابة المزيد من التعليمات البرمجية.
يتيح لك XcGlogger تسجيل التفاصيل إلى وحدة التحكم (واختياريًا ملف ، أو وجهات مخصصة أخرى) ، تمامًا كما لو كنت مع NSLog() أو print() ، ولكن مع معلومات إضافية ، مثل التاريخ ، اسم الوظيفة ، اسم الملف ورقم السطر.
انتقل من هذا:
Simple message
لهذا:
2014-06-09 06:44:43.600 [Debug] [AppDelegate.swift:40] application(_:didFinishLaunchingWithOptions:): Simple message
ينفذ:
git submodule add https://github.com/DaveWoodCom/XCGLogger.git
في مجلد المستودع الخاص بك.
أضف السطر التالي إلى Cartfile الخاص بك.
github "DaveWoodCom/XCGLogger" ~> 7.1.5
ثم قم بتشغيل carthage update --no-use-binaries أو مجرد carthage update . للحصول على تفاصيل تركيب واستخدام قرطاج ، تفضل بزيارة صفحة المشروع.
سيحتاج المطورون الذين يعملون 5.0 وما فوق في SWIFT إلى إضافة $(SRCROOT)/Carthage/Build/iOS/ObjcExceptionBridging.framework إلى ملفات المدخلات الخاصة بهم في مرحلة بناء أطر عمل copy.
أضف شيئًا مشابهًا للخطوط التالية إلى Podfile . قد تحتاج إلى ضبط بناءً على النظام الأساسي الخاص بك ، الإصدار/الفرع وما إلى ذلك.
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '12.0'
use_frameworks!
pod 'XCGLogger', '~> 7.1.5'
سيشمل تحديد POD XCGLogger بمفرده الإطار الأساسي. بدأنا في إضافة Subspecs للسماح لك بتضمين مكونات اختيارية أيضًا:
pod 'XCGLogger/UserInfoHelpers', '~> 7.1.5' : قم بتضمين بعض التعليمات البرمجية التجريبية للمساعدة في التعامل مع قوسمات UserInfo لوضع علامة على رسائل السجل.
ثم قم بتشغيل pod install . للحصول على تفاصيل تركيب واستخدام Cocoapods ، تفضل بزيارة موقع الويب الرسمي.
ملاحظة: قبل Cocoapods 1.4.0 ، لم يكن من الممكن استخدام قرون متعددة مع مزيج من الإصدارات السريعة. قد تحتاج إلى التأكد من تكوين كل جراب لإصدار Swift الصحيح (تحقق من الأهداف في مشروع POD لمساحة العمل الخاصة بك). إذا قمت بضبط الإصدار السريع يدويًا لمشروع ، فسيتم إعادة تعيينه في المرة التالية التي تقوم فيها بتشغيل pod install . يمكنك إضافة خطاف post_install إلى podfile لأتمتة إعداد الإصدارات SWIFT الصحيحة. هذا غير مجصح إلى حد كبير ، ولست متأكدًا من أنه حل جيد ، لكن يبدو أنه يعمل:
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
يمكنك ضبط ذلك لتناسب احتياجاتك بالطبع.
أضف الإدخال التالي إلى تبعيات الحزمة الخاصة بك:
.Package(url: "https://github.com/DaveWoodCom/XCGLogger.git", majorVersion: 7)
يستخدم:
تهدف طريقة البدء السريعة هذه فقط إلى الحصول على الركض مع المسجل. ومع ذلك ، يجب عليك استخدام الاستخدام المتقدم أدناه للحصول على أقصى استفادة من هذه المكتبة.
أضف مشروع XCGLOGGER باعتباره مشروعًا فرعيًا لمشروعك ، وأضف المكتبة المناسبة كاعتماد على هدفك (الأهداف). ضمن علامة التبويب General للهدف الخاص بك ، أضف XCGLogger.framework و ObjcExceptionBridging.framework إلى قسم Embedded Binaries .
ثم ، في كل ملف مصدر:
import XCGLoggerفي ملف AppDelegate الخاص بك (أو ملف عالمي آخر) ، أعلن أن ثابتًا عالميًا إلى مثيل XCGlogger الافتراضي.
let log = XCGLogger . defaultفي
application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplicationLaunchOptionsKey : Any ] ? = nil ) // iOS, tvOSأو
applicationDidFinishLaunching ( _ notification : Notification ) // macOSوظيفة ، قم بتكوين الخيارات التي تحتاجها:
log . setup ( level : . debug , showThreadName : true , showLevel : true , showFileNames : true , showLineNumbers : true , writeToFile : " path/to/file " , fileLevel : . debug ) قيمة writeToFile: يمكن أن تكون String أو URL . إذا كان الملف موجودًا بالفعل ، فسيتم مسحه قبل استخدامه. حذف المعلمة أو قم nil على التسجيل إلى وحدة التحكم فقط. يمكنك اختياريًا تعيين مستوى سجل مختلف لإخراج الملف باستخدام المعلمة fileLevel: قم بتعيينه على nil أو حذفه لاستخدام مستوى السجل نفسه مثل وحدة التحكم.
ثم ، كلما ترغب في تسجيل شيء ما ، استخدم إحدى طرق الراحة:
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 " ) تقوم الطرق المختلفة بتعيين مستوى السجل للرسالة. ستقوم XcGlogger بطباعة الرسائل فقط بمستوى سجل أكبر أو يساوي إعداد مستوى السجل الحالي. لذا فإن مسجلًا بمستوى .error سيؤدي فقط إلى إخراج رسائل سجل مع مستوى .error أو .severe أو .alert أو .emergency
يهدف XcGlogger إلى أن تكون بسيطًا للاستخدام وأن تجعلك تعمل بسرعة مع عدد أقل من خطين من التعليمات البرمجية أعلاه. لكنه يسمح بتحكم ومرونة أكبر بكثير.
يمكن تكوين مسجل لتسليم رسائل السجل إلى مجموعة متنوعة من الوجهات. باستخدام الإعداد الأساسي أعلاه ، سيقوم المسجل بإخراج رسائل تسجيل الدخول إلى وحدة تحكم Debug القياسية Xcode ، واختياري ملف في حالة توفير مسار. من المحتمل جدًا أنك سترغب في إرسال سجلات إلى أماكن أكثر إثارة للاهتمام ، مثل وحدة التحكم في نظام Apple أو قاعدة بيانات أو خادم طرف ثالث أو تطبيق آخر مثل NSLogger. يتم تحقيق ذلك عن طريق إضافة الوجهة إلى المسجل.
فيما يلي مثال على تكوين المسجل للإخراج إلى سجل نظام Apple بالإضافة إلى ملف.
// 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 ( )يمكنك تكوين كل وجهة سجل بخيارات مختلفة اعتمادًا على احتياجاتك.
نمط الاستخدام الشائع الآخر هو وجود العديد من أجهزة تسجيل الدخول ، وربما واحدة لمشكلات واجهة المستخدم ، وواحد للشبكات ، وآخر لمشكلات البيانات.
يمكن أن يكون لكل وجهة سجل مستوى السجل الخاص بها. كراحة ، يمكنك تعيين مستوى السجل على كائن السجل نفسه وسيقوم بتمرير هذا المستوى إلى كل وجهة. ثم قم بتعيين الوجهات التي يجب أن تكون مختلفة.
ملاحظة : لا يمكن إضافة كائن الوجهة إلا إلى كائن مسجل واحد ، فإن إضافته إلى ثانية سيقوم بإزالته من الأول.
بدلاً من ذلك ، يمكنك استخدام إغلاق لتهيئة متغيرك العالمي ، بحيث يتم التهيئة في مكان واحد
let log : XCGLogger = {
let log = XCGLogger ( identifier : " advancedLogger " , includeDefaultDestinations : false )
// Customize as needed
return log
} ( ) ملاحظة : هذا ينشئ كائن السجل بتكاسل ، مما يعني أنه لم يتم إنشاؤه حتى يكون هناك حاجة إليه بالفعل. هذا يؤخر الإخراج الأولي لتفاصيل معلومات التطبيق. ولهذا السبب ، أوصي بإجبار كائن السجل على إنشاء APP عن طريق إضافة السطر let _ = log في الجزء العلوي من طريقة didFinishLaunching الخاصة بك إذا لم تقم بتسجيل شيء على تشغيل التطبيق.
يمكنك تسجيل السلاسل:
log . debug ( " Hi there! " )أو إلى حد كبير أي شيء تريده:
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 ] ) جديد على XCGlogger 4 ، يمكنك الآن إنشاء مرشحات لتطبيقها على المسجل الخاص بك (أو إلى وجهات محددة). قم بإنشاء وتكوين المرشحات الخاصة بك (أمثلة أدناه) ، ثم إضافتها إلى كائنات المسجل أو الوجهة عن طريق تعيين خاصية filters الاختيارية على صفيف يحتوي على المرشحات. يتم تطبيق المرشحات بالترتيب الموجود في الصفيف. أثناء المعالجة ، يتم سؤال كل مرشح عما إذا كان يجب استبعاد رسالة السجل من السجل. إذا استبعد أي مرشح رسالة السجل ، فسيتم استبعادها. المرشحات ليس لديها طريقة لعكس استبعاد مرشح آخر.
إذا كانت خاصية filters الوجهة nil ، فسيتم استخدام خاصية filters السجل بدلاً من ذلك. للحصول على سجل وجهة واحد ، في حين أن جميع الوجهات الأخرى تقوم بتصفية شيء ما ، أضف المرشحات إلى كائن السجل وتعيين خاصية filters الوجهة الواحدة على صفيف فارغ [] .
ملاحظة : على عكس الوجهات ، يمكنك إضافة نفس كائن المرشح إلى أجهزة تسجيل و/أو وجهات متعددة متعددة.
لاستبعاد جميع رسائل السجل من ملف معين ، قم بإنشاء مرشح استبعاد مثل SO:
log . filters = [ FileNameFilter ( excludeFrom : [ " AppDelegate.swift " ] , excludePathWhenMatching : true ) ] excludeFrom: يأخذ Array<String> أو Set<String> حتى تتمكن من تحديد ملفات متعددة في نفس الوقت.
excludePathWhenMatching: الإعدادات الافتراضية إلى true حتى تتمكن من حذفها إلا إذا كنت ترغب في مطابقة المسار أيضًا.
لتضمين رسائل السجل فقط لمجموعة محددة للملفات ، قم بإنشاء المرشح باستخدام includeFrom: Entirmizer. من الممكن أيضًا تبديل الخاصية inverse لقلب مرشح الاستبعاد إلى مرشح التضمين.
من أجل تصفية رسائل السجل حسب العلامة ، يجب بالطبع أن تكون قادرًا على تعيين علامة على رسائل السجل. يمكن أن يكون لكل رسالة سجل الآن بيانات إضافية محددة للمستخدم متصلة بها ، لاستخدامها بواسطة المرشحات (و/أو التنسيقات وما إلى ذلك). يتم التعامل مع هذا مع userInfo: Dictionary<String, Any> كائن. يجب أن يكون مفتاح القاموس عبارة عن سلسلة أسماء لتجنب التصادمات مع الإضافات المستقبلية. ستبدأ المفاتيح الرسمية بـ com.cerebralgardens.xcglogger . يمكن الوصول إلى مفتاح العلامة بواسطة XCGLogger.Constants.userInfoKeyTags . أنت بالتأكيد لا تريد أن تكتب ذلك ، لذلك لا تتردد في إنشاء اختصار عالمي: let tags = XCGLogger.Constants.userInfoKeyTags . الآن يمكنك بسهولة وضع علامة على سجلاتك:
let sensitiveTag = " Sensitive "
log . debug ( " A tagged log message " , userInfo : [ tags : sensitiveTag ] ) يمكن أن تكون قيمة العلامات عبارة عن Array<String> ، أو Set<String> ، أو مجرد String ، اعتمادًا على احتياجاتك. سيعملون جميعًا بنفس الطريقة عند تصفية.
اعتمادًا على سير العمل والاستخدام ، من المحتمل أن تنشئ طرقًا أسرع لإعداد قاموس userInfo . انظر أدناه للحصول على اختصارات أخرى ممكنة.
الآن بعد أن حصلت على علامات على سجلاتك ، يمكنك التصفية بسهولة:
log . filters = [ TagFilter ( excludeFrom : [ sensitiveTag ] ) ] تمامًا مثل FileNameFilter ، يمكنك استخدام includeFrom: أو تبديل inverse لتضمين رسائل السجل فقط التي تحتوي على العلامات المحددة.
يشبه التصفية بواسطة المطور تمامًا التصفية عن طريق العلامة ، فقط باستخدام مفتاح userInfo لـ XCGLogger.Constants.userInfoKeyDevs . في الواقع ، كلا المرشحين عبارة عن فئات فرعية لفئة UserInfoFilter التي يمكنك استخدامها لإنشاء مرشحات إضافية. انظر تمديد xcglogger أدناه.
في المشاريع الكبيرة التي تحتوي على العديد من المطورين ، ربما ترغب في البدء في وضع علامة على رسائل السجل ، وكذلك الإشارة إلى المطور الذي أضاف الرسالة.
على الرغم من أنها مرنة للغاية ، إلا أن قاموس userInfo يمكن أن يكون مرهقًا بعض الشيء للاستخدام. هناك بعض الطرق الممكنة التي يمكنك استخدامها في الأشياء ببساطة. ما زلت أختبرها بنفسي ، لذا فهي ليست جزءًا رسميًا من المكتبة حتى الآن (أحب التعليقات أو الاقتراحات الأخرى).
لقد أنشأت بعض التعليمات البرمجية التجريبية للمساعدة في إنشاء قواميس UserInfo. (قم بتضمين UserInfoHelpers الاختياري subspec إذا كنت تستخدم cocoapods). تحقق من تطبيق iOS التجريبي لرؤيته قيد الاستخدام.
هناك هيكلان يتوافقان مع بروتوكول UserInfoTaggingProtocol . Tag و Dev .
يمكنك إنشاء امتداد على كل من هذه التي تناسب مشروعك. على سبيل المثال:
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 " )
} جنبا إلى جنب مع هذه الأنواع ، هناك مشغل محمّل | يمكن استخدامها لدمجها معًا في قاموس متوافق مع UserInfo: معلمة مكالمات التسجيل.
ثم يمكنك تسجيل رسائل مثل هذا:
log . debug ( " A tagged log message " , userInfo : Dev . dave | Tag . sensitive ) هناك بعض المشكلات الحالية التي أراها مع UserInfoHelpers هذه ، وهذا هو السبب في أنني جعلتها اختيارية/تجريبية في الوقت الحالي. أحب أن أسمع التعليقات/الاقتراحات للتحسينات.
| يندمج القواميس طالما لا توجد Set s. إذا كان أحد القواميس يحتوي على Set ، فسيستخدم أحدها ، دون دمجها. تفضل الجانب الأيسر إذا كان لدى كلا الجانبين مجموعة لنفس المفتاح.userInfo: المعلمة تحتاج إلى قاموس ، لا يمكنك المرور في كائن dev أو علامة واحدة. تحتاج إلى استخدام اثنين على الأقل مع | المشغل لتحويله تلقائيًا إلى قاموس متوافق. إذا كنت تريد فقط علامة واحدة على سبيل المثال ، فيجب عليك الوصول إلى المعلمة .dictionary يدويًا: userInfo: Tag("Blah").dictionary . جميع طرق السجل تعمل على الإغلاق. باستخدام نفس السكر النحوي مثل وظيفة Swift's assert() ، يضمن هذا النهج أننا لا نضيع موارد رسائل السجل التي لن يتم إخراجها على أي حال ، مع الحفاظ في الوقت نفسه على موقع مكالمة نظيفة.
على سبيل المثال ، لن يضيع عبارة السجل التالية الموارد إذا تم قمع مستوى سجل الأخطاء:
log . debug ( " The description of ( thisObject ) is really expensive to create " ) وبالمثل ، دعنا نقول أنه يتعين عليك التكرار من خلال حلقة من أجل القيام ببعض الحسابات قبل تسجيل النتيجة. في الهدف-C ، يمكنك وضع كتلة الرمز هذه بين #if #endif ، ومنع الرمز من التشغيل. ولكن في سويفت ، ستحتاج سابقًا إلى معالجة هذه الحلقة ، تضيع الموارد. مع XCGLogger الأمر بسيط مثل:
log . debug {
var total = 0.0
for receipt in receipts {
total += receipt . total
}
return " Total of all receipts: ( total ) "
} في الحالات التي ترغب فيها في تنفيذ التعليمات البرمجية بشكل انتقائي دون إنشاء سطر سجل ، أو إرجاع nil ، أو استخدام إحدى الطرق: verboseExec و debugExec و infoExec و warningExec و errorExec و severeExec .
يمكنك إنشاء كائن DateFormatter الخاص بك وتعيينه إلى المسجل.
let dateFormatter = DateFormatter ( )
dateFormatter . dateFormat = " MM/dd/yyyy hh:mma "
dateFormatter . locale = Locale . current
log . dateFormatter = dateFormatterيدعم XcGlogger إضافة رموز التنسيق إلى رسائل السجل الخاصة بك لتمكين اللون في أماكن مختلفة. كان الخيار الأصلي هو استخدام المكون الإضافي XcodeColors. ومع ذلك ، لم يعد Xcode (اعتبارًا من الإصدار 8) يدعم المكونات الإضافية رسميًا. لا يزال بإمكانك عرض سجلاتك في اللون ، وليس فقط في Xcode في الوقت الحالي. يمكنك استخدام دعم ألوان ANSI لإضافة لون إلى كائنات FileDestination وعرض سجلاتك عبر نافذة طرفية. يمنحك هذا بعض الخيارات الإضافية مثل إضافة BOLD أو ITALICS أو (من فضلك لا) وميض!
بمجرد تمكينه ، يمكن أن يكون لكل مستوى سجل لونه الخاص. يمكن تخصيص هذه الألوان حسب الرغبة. إذا كنت تستخدم عمليات تسجيل الدخول المتعددة ، فيمكنك بدلاً من ذلك تعيين كل مسجل على لونه.
مثال على إعداد تنسيق 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 ]
} كما هو الحال مع المرشحات ، يمكنك استخدام نفس الكائنات التنسيقية لوجود لوجبرز و/أو وجهات متعددة. إذا كانت خاصية formatters للوجهة nil ، فسيتم استخدام خاصية formatters الخاصة بـ Logger بدلاً من ذلك.
راجع تمديد XcGlogger أدناه للحصول على معلومات حول إنشاء التنسيقات المخصصة الخاصة بك.
باستخدام أعلام البناء السريعة ، يمكن استخدام مستويات سجل مختلفة في تصحيح الأخطاء مقابل التدريج/الإنتاج. انتقل إلى إعدادات البناء -> برنامج التحويل البرمجي السريع -أعلام مخصصة -> أعلام سريعة أخرى وأضف -DDEBUG إلى إدخال التصحيح.
#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 يمكنك تعيين أي عدد من الخيارات بطريقة مماثلة. راجع تطبيق iOSDEMO المحدث للحصول على مثال على استخدام وجهات السجل المختلفة بناءً على الخيارات ، ابحث عن USE_NSLOG .
بشكل افتراضي ، ستعمل وجهات السجل الموردة على معالجة السجلات الموجودة على الخيط الذي تم استدعاؤه. هذا لضمان عرض رسالة السجل على الفور عند تصحيح التطبيق. يمكنك إضافة نقطة توقف مباشرة بعد مكالمة السجل ومعرفة النتائج عندما تضرب نقطة التوقف.
ومع ذلك ، إذا لم تكن تقوم بتصحيح التطبيق بنشاط ، فإن معالجة السجلات على مؤشر الترابط الحالي يمكن أن تقدم ضربة أداء. يمكنك الآن تحديد عملية الوجهة لسجلاتها في قائمة انتظار إرسال من اختيارك (أو حتى استخدام عملية افتراضية متوفرة).
fileDestination . logQueue = XCGLogger . logQueueأو حتى
fileDestination . logQueue = DispatchQueue . global ( qos : . background )هذا يعمل بشكل جيد للغاية عند الجمع بين طريقة التكوينات البديلة أعلاه.
#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
}
#endifعند استخدام التكوين المتقدم للمسجل (انظر الاستخدام المتقدم أعلاه) ، يمكنك الآن تحديد أن إلحاق المسجل إلى ملف سجل موجود ، بدلاً من الكتابة فوقه تلقائيًا.
إضافة الاختياري shouldAppend: معلمة عند تهيئة كائن FileDestination . يمكنك أيضًا إضافة appendMarker: المعلمة لإضافة علامة إلى ملف السجل الذي يشير إلى المكان الذي بدأ فيه مثيل جديد لتطبيقك. بشكل افتراضي ، سنضيف -- ** ** ** -- إذا تم حذف المعلمة. قم بتعيينه على nil لتخطي إلحاق العلامة.
let fileDestination = FileDestination(writeToFile: "/path/to/file", identifier: "advancedLogger.fileDestination", shouldAppend: true, appendMarker: "-- Relauched App --")
عند تسجيل الدخول إلى ملف ، لديك خيار لتدوير ملف السجل تلقائيًا إلى وجهة مؤشفة ، واطلب من المسجل تلقائيًا إنشاء ملف سجل جديد في مكانه القديم.
قم بإنشاء وجهة باستخدام فئة AutoRotatingFileDestination وقم بتعيين الخصائص التالية:
targetMaxFileSize : تلقائي تلقائي بمجرد أن يكون الملف أكبر من هذا
targetMaxTimeInterval : تدوير تلقائي بعد هذه الثواني العديدة
targetMaxLogFiles : عدد ملفات السجل المؤرشفة التي يجب الاحتفاظ بها ، يتم حذف تلك الأقدم تلقائيًا
هذه كلها إرشادات للمسجل ، وليس الحدود الصعبة.
يمكنك إنشاء وجهات سجل بديلة (إلى جانب تلك المدمجة). يجب أن تنفذ وجهة السجل المخصصة بروتوكول DestinationProtocol . إنشاء كائنك ، وتكوينه ، ثم إضافته إلى كائن XCGLogger مع add(destination:) . هناك فئتان مقصودتان أساسيتان ( BaseDestination و BaseQueuedDestination ) يمكنك أن ترث من التعامل مع معظم العملية بالنسبة لك ، مما يتطلب منك تطبيق طريقة إضافية واحدة فقط في فئتك المخصصة. ألقِ نظرة على ConsoleDestination FileDestination للحصول على أمثلة.
يمكنك أيضًا إنشاء مرشحات مخصصة أو تنسيقات. ألقِ نظرة على الإصدارات المقدمة كنقطة انطلاق. لاحظ أن المرشحات والتنسيقات لديها القدرة على تغيير رسائل السجل عند معالجتها. هذا يعني أنه يمكنك إنشاء مرشح يقوم بتعطيل كلمات المرور ، ويسلط الضوء على كلمات محددة ، وترميز الرسائل ، وما إلى ذلك.
Xcglogger هو أفضل مسجل متاح لـ Swift بسبب مساهمات المجتمع مثلك. هناك العديد من الطرق التي يمكنك من خلالها المساعدة في الاستمرار في جعلها رائعة.
ملاحظة : عند تقديم طلب سحب ، يرجى استخدام الكثير من الالتزامات الصغيرة التزام واحد ضخم. يجعل من الأسهل بكثير الاندماج عندما يكون هناك العديد من طلبات السحب التي يجب دمجها لإصدار جديد.
إذا وجدت هذه المكتبة مفيدة ، فستجد بالتأكيد هذه الأداة الأخرى مفيدة:
الوكالة الدولية للطاقة: https://watchdogforxcode.com/
أيضا ، يرجى التحقق من بعض مشاريعي الأخرى:
سجل التغيير الآن في ملفه الخاص: changelog.md