
Xcglogger เป็นโมดูลบันทึกการดีบักดั้งเดิมสำหรับใช้ในโครงการ Swift
SWIFT ไม่รวมตัวประมวลผลล่วงหน้า C ดังนั้นนักพัฒนาจึงไม่สามารถใช้บันทึกการดีบัก #define Macros ที่พวกเขาจะใช้ใน 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 ไปยังไฟล์อินพุตของพวกเขาในขั้นตอนการสร้าง Carthage Frameworks
เพิ่มสิ่งที่คล้ายกับบรรทัดต่อไปนี้ใน 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 มันเป็นไปไม่ได้ที่จะใช้พ็อดหลายตัวที่มีส่วนผสมของเวอร์ชันที่รวดเร็ว คุณอาจต้องตรวจสอบให้แน่ใจว่าแต่ละ POD ได้รับการกำหนดค่าสำหรับเวอร์ชัน Swift ที่ถูกต้อง (ตรวจสอบเป้าหมายในโครงการ POD ของพื้นที่ทำงานของคุณ) หากคุณปรับรุ่น Swift ด้วยตนเองสำหรับโครงการจะรีเซ็ตในครั้งต่อไปที่คุณเรียกใช้ 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)
ใช้:
วิธีการเริ่มต้นอย่างรวดเร็วนี้มีจุดประสงค์เพื่อให้คุณได้รับและทำงานกับ Logger อย่างไรก็ตามคุณควรใช้การใช้งานขั้นสูงด้านล่างเพื่อใช้ประโยชน์สูงสุดจากห้องสมุดนี้
เพิ่มโครงการ 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 ตั้งเป้าหมายที่จะใช้งานง่ายและทำให้คุณทำงานได้อย่างรวดเร็วด้วยรหัสด้านบนเพียง 2 บรรทัด แต่มันช่วยให้สามารถควบคุมและยืดหยุ่นได้มากขึ้น
เครื่องบันทึกสามารถกำหนดค่าให้ส่งข้อความบันทึกไปยังจุดหมายปลายทางที่หลากหลาย การใช้การตั้งค่าพื้นฐานด้านบนตัวบันทึกจะส่งข้อความบันทึกไปยังคอนโซลดีบั๊ก XCode มาตรฐานและเลือกไฟล์หากมีพา ธ เป็นไปได้ค่อนข้างมากที่คุณจะต้องส่งบันทึกไปยังสถานที่ที่น่าสนใจมากขึ้นเช่น Apple System Console ฐานข้อมูลเซิร์ฟเวอร์บุคคลที่สามหรือแอปพลิเคชันอื่นเช่น NSLogger สิ่งนี้สามารถทำได้โดยการเพิ่มปลายทางลงในตัวบันทึก
นี่คือตัวอย่างของการกำหนดค่า logger เพื่อส่งออกไปยังบันทึกระบบ 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 ( )คุณสามารถกำหนดค่าปลายทางล็อกแต่ละตัวด้วยตัวเลือกที่แตกต่างกันขึ้นอยู่กับความต้องการของคุณ
รูปแบบการใช้งานทั่วไปอีกประการหนึ่งคือการมีคนตัดไม้หลายตัวบางทีอาจเป็นเรื่องหนึ่งสำหรับปัญหา UI หนึ่งสำหรับการสร้างเครือข่ายและอีกสิ่งหนึ่งสำหรับปัญหาข้อมูล
ปลายทางล็อกแต่ละแห่งสามารถมีระดับบันทึกของตัวเอง เพื่อความสะดวกคุณสามารถตั้งค่าระดับบันทึกบนวัตถุบันทึกเองและมันจะผ่านระดับนั้นไปยังแต่ละปลายทาง จากนั้นตั้งค่าจุดหมายปลายทางที่ต้องแตกต่างกัน
หมายเหตุ : วัตถุปลายทางสามารถเพิ่มลงในวัตถุ Logger หนึ่งชิ้นเท่านั้นการเพิ่มลงในวินาทีจะลบออกจากวัตถุแรก
หรือคุณสามารถใช้การปิดเพื่อเริ่มต้นตัวแปรทั่วโลกของคุณเพื่อให้การเริ่มต้นทั้งหมดทำในที่เดียว
let log : XCGLogger = {
let log = XCGLogger ( identifier : " advancedLogger " , includeDefaultDestinations : false )
// Customize as needed
return log
} ( ) หมายเหตุ : สิ่งนี้สร้างวัตถุบันทึกอย่างเกียจคร้านซึ่งหมายความว่ามันไม่ได้สร้างขึ้นจนกว่าจะจำเป็นจริง สิ่งนี้จะทำให้รายละเอียดข้อมูลแอปเริ่มต้นล่าช้า ด้วยเหตุนี้ฉันขอแนะนำให้บังคับให้วัตถุบันทึกที่จะสร้างเมื่อเปิดใช้งานแอปโดยการเพิ่มบรรทัด 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 ตอนนี้คุณสามารถสร้างตัวกรองเพื่อใช้กับ Logger ของคุณ (หรือไปยังปลายทางเฉพาะ) สร้างและกำหนดค่าตัวกรองของคุณ (ตัวอย่างด้านล่าง) จากนั้นเพิ่มลงในตัวบันทึกหรือวัตถุปลายทางโดยการตั้งค่าคุณสมบัติ filters เสริมเป็นอาร์เรย์ที่มีตัวกรอง ตัวกรองถูกนำไปใช้ตามลำดับที่มีอยู่ในอาร์เรย์ ในระหว่างการประมวลผลตัวกรองแต่ละตัวจะถูกถามว่าข้อความบันทึกควรถูกแยกออกจากบันทึกหรือไม่ หากตัวกรองใด ๆ ไม่รวมข้อความบันทึกก็จะถูกแยกออก ตัวกรองไม่มีวิธีที่จะย้อนกลับการยกเว้นตัวกรองอื่น
หากคุณสมบัติ filters ปลายทางเป็น nil จะใช้คุณสมบัติ filters ของบันทึกแทน หากต้องการมีบันทึกปลายทางเดียวทุกอย่างในขณะที่มีจุดหมายปลายทางอื่น ๆ ทั้งหมดกรองบางสิ่งให้เพิ่มตัวกรองลงในวัตถุบันทึกและตั้งค่าคุณสมบัติ filters ปลายทางเดียวเป็นอาร์เรย์ที่ว่างเปล่า []
หมายเหตุ : แตกต่างจากจุดหมายปลายทางคุณสามารถเพิ่มวัตถุตัวกรองเดียวกันในตัวบันทึกหลายตัวและ/หรือหลายจุดหมายปลายทาง
หากต้องการยกเว้นข้อความบันทึกทั้งหมดจากไฟล์เฉพาะให้สร้างตัวกรองการยกเว้นเช่น SO:
log . filters = [ FileNameFilter ( excludeFrom : [ " AppDelegate.swift " ] , excludePathWhenMatching : true ) ] excludeFrom: ใช้ Array<String> หรือ Set<String> เพื่อให้คุณสามารถระบุหลายไฟล์ในเวลาเดียวกัน
excludePathWhenMatching: ค่าเริ่มต้นเป็น true เพื่อให้คุณสามารถละเว้นได้เว้นแต่คุณจะต้องการจับคู่เส้นทางของ PATH เช่นกัน
ในการรวมข้อความบันทึกเฉพาะสำหรับชุดเฉพาะไปยังไฟล์ให้สร้างตัวกรองโดยใช้ includeFrom: initializer นอกจากนี้ยังเป็นไปได้ที่จะสลับคุณสมบัติ inverse เพื่อพลิกตัวกรองการยกเว้นไปยังตัวกรองการรวม
ในการกรองข้อความบันทึกโดยแท็กคุณต้องสามารถตั้งค่าแท็กบนข้อความบันทึกได้ ตอนนี้ข้อความบันทึกแต่ละรายการสามารถมีข้อมูลเพิ่มเติมที่ผู้ใช้กำหนดไว้ที่แนบมากับพวกเขาเพื่อใช้โดยตัวกรอง (และ/หรือ formatters ฯลฯ ) สิ่งนี้ได้รับการจัดการด้วย 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 (รวม subspec UserInfoHelpers เสริมหากใช้ cocoapods) ตรวจสอบแอพสาธิต iOS เพื่อดูการใช้งาน
มีสอง structs ที่สอดคล้องกับโปรโตคอล 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 หากหนึ่งในพจนานุกรมมี Set มันจะใช้หนึ่งในนั้นโดยไม่รวมกัน เลือกด้านซ้ายมือถ้าทั้งสองฝ่ายมีชุดสำหรับคีย์เดียวกันuserInfo: พารามิเตอร์ต้องการพจนานุกรมคุณจึงไม่สามารถส่งผ่านในวัตถุ dev หรือแท็กเดียว คุณต้องใช้อย่างน้อยสองกับ | ผู้ประกอบการจะให้แปลงเป็นพจนานุกรมที่เข้ากันได้โดยอัตโนมัติ หากคุณต้องการเพียงแท็กเดียวเท่านั้นคุณต้องเข้าถึงพารามิเตอร์ .dictionary ด้วยตนเอง: userInfo: Tag("Blah").dictionary วิธีการบันทึกทั้งหมดทำงานเมื่อปิด การใช้น้ำตาลวากยสัมพันธ์เดียวกับฟังก์ชั่น assert() ของ Swift วิธีการนี้ช่วยให้มั่นใจได้ว่าเราจะไม่เสียทรัพยากรการสร้างข้อความบันทึกที่จะไม่ส่งออกอยู่ดีในขณะเดียวกันก็รักษาไซต์การโทรที่สะอาด
ตัวอย่างเช่นคำสั่งบันทึกต่อไปนี้จะไม่สูญเสียทรัพยากรหากระดับบันทึกการดีบักถูกระงับ:
log . debug ( " The description of ( thisObject ) is really expensive to create " ) ในทำนองเดียวกันสมมติว่าคุณต้องวนซ้ำผ่านลูปเพื่อทำการคำนวณบางอย่างก่อนที่จะบันทึกผลลัพธ์ ใน Objective-C คุณสามารถใส่บล็อกรหัสนั้นระหว่าง #if #endif และป้องกันไม่ให้รหัสทำงาน แต่ใน Swift ก่อนหน้านี้คุณจะต้องดำเนินการยังคงดำเนินการวนซ้ำ ด้วย 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 ของคุณเองและกำหนดให้กับ Logger
let dateFormatter = DateFormatter ( )
dateFormatter . dateFormat = " MM/dd/yyyy hh:mma "
dateFormatter . locale = Locale . current
log . dateFormatter = dateFormatterXcGlogger รองรับการเพิ่มรหัสการจัดรูปแบบลงในข้อความบันทึกของคุณเพื่อเปิดใช้งานสีในสถานที่ต่าง ๆ ตัวเลือกดั้งเดิมคือการใช้ปลั๊กอิน XCodecolors อย่างไรก็ตาม XCode (ณ รุ่น 8) ไม่รองรับปลั๊กอินอย่างเป็นทางการอีกต่อไป คุณยังสามารถดูบันทึกของคุณเป็นสีได้ แต่ไม่ได้อยู่ใน Xcode ในขณะนี้ คุณสามารถใช้การรองรับสี ANSI เพื่อเพิ่มสีให้กับวัตถุที่ยื่นของคุณและดูบันทึกของคุณผ่านหน้าต่างเทอร์มินัล สิ่งนี้จะช่วยให้คุณมีตัวเลือกพิเศษเช่นการเพิ่มตัวเอียงตัวเอียงหรือ (โปรดอย่า) กระพริบ!
เมื่อเปิดใช้งานแต่ละระดับบันทึกสามารถมีสีของตัวเอง สีเหล่านี้สามารถปรับแต่งได้ตามที่ต้องการ หากใช้ตัวบันทึกหลายตัวคุณสามารถตั้งค่าตัวบันทึกแต่ละตัวเป็นสีของตัวเองได้
ตัวอย่างของการตั้งค่า ANSI Formatter:
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 ด้านล่างสำหรับข้อมูลเกี่ยวกับการสร้าง Formatters ที่กำหนดเองของคุณเอง
ด้วยการใช้ Swift Build Flags ระดับบันทึกที่แตกต่างกันสามารถใช้ในการดีบักกับการจัดเตรียม/การผลิต ไปที่การสร้างการตั้งค่า -> Swift Compiler -Flag ที่กำหนดเอง -> Swift Flag อื่น ๆ และเพิ่ม -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เมื่อใช้การกำหนดค่าขั้นสูงของ logger (ดูการใช้งานขั้นสูงด้านบน) ตอนนี้คุณสามารถระบุได้ว่าตัวบันทึกจะผนวกเข้ากับไฟล์บันทึกที่มีอยู่แทนที่จะเขียนทับโดยอัตโนมัติ
เพิ่มสิ่งที่ shouldAppend: พารามิเตอร์เมื่อเริ่มต้นวัตถุ FileDestination นอกจากนี้คุณยังสามารถเพิ่ม appendMarker: พารามิเตอร์เพื่อเพิ่มเครื่องหมายลงในไฟล์บันทึกที่ระบุว่าอินสแตนซ์ใหม่ของแอปของคุณเริ่มท้าย โดยค่าเริ่มต้นเราจะเพิ่ม -- ** ** ** -- หากมีการละเว้นพารามิเตอร์ ตั้งค่าเป็น nil เพื่อข้ามการต่อท้ายเครื่องหมาย
let fileDestination = FileDestination(writeToFile: "/path/to/file", identifier: "advancedLogger.fileDestination", shouldAppend: true, appendMarker: "-- Relauched App --")
เมื่อลงชื่อเข้าใช้ไฟล์คุณมีตัวเลือกในการหมุนไฟล์บันทึกไปยังปลายทางที่เก็บถาวรโดยอัตโนมัติและให้ตัวบันทึกจะสร้างไฟล์บันทึกใหม่โดยอัตโนมัติแทนไฟล์เก่า
สร้างปลายทางโดยใช้คลาส AutoRotatingFileDestination และตั้งค่าคุณสมบัติต่อไปนี้:
targetMaxFileSize : หมุนอัตโนมัติเมื่อไฟล์มีขนาดใหญ่กว่านี้
targetMaxTimeInterval : หมุนอัตโนมัติหลังจากหลายวินาทีนี้
targetMaxLogFiles : จำนวนไฟล์บันทึกที่เก็บถาวรที่จะเก็บไว้ไฟล์เก่าจะถูกลบโดยอัตโนมัติ
นี่คือแนวทางทั้งหมดสำหรับคนตัดไม้ไม่ใช่ขีด จำกัด ที่ยาก
คุณสามารถสร้างจุดหมายปลายทางบันทึกทางเลือก (นอกเหนือจากที่ในตัว) ปลายทางบันทึกที่กำหนดเองของคุณจะต้องใช้โปรโตคอล DestinationProtocol Protocol อินสแตนซ์วัตถุของคุณกำหนดค่าแล้วเพิ่มลงในวัตถุ XCGLogger ด้วย add(destination:) มีคลาสปลายทางพื้นฐานสองคลาส ( BaseDestination และ BaseQueuedDestination ) คุณสามารถสืบทอดได้จากการจัดการกระบวนการส่วนใหญ่สำหรับคุณโดยกำหนดให้คุณใช้วิธีการเพิ่มเติมหนึ่งวิธีในคลาสที่กำหนดเองเท่านั้น ลองดูที่ ConsoleDestination และ FileDestination ตัวอย่าง
คุณยังสามารถสร้างตัวกรองที่กำหนดเองหรือ Formatters ลองดูที่เวอร์ชันที่ให้ไว้เป็นจุดเริ่มต้น โปรดทราบว่าตัวกรองและฟอร์แมตมีความสามารถในการเปลี่ยนแปลงข้อความบันทึกเมื่อประมวลผล ซึ่งหมายความว่าคุณสามารถสร้างตัวกรองที่แถบรหัสผ่านเน้นคำเฉพาะข้อความเข้ารหัสข้อความ ฯลฯ
Xcglogger เป็นเครื่องบันทึกที่ดีที่สุดสำหรับ Swift เนื่องจากการมีส่วนร่วมจากชุมชนเช่นคุณ มีหลายวิธีที่คุณสามารถช่วยให้มันยอดเยี่ยมได้
หมายเหตุ : เมื่อส่งคำขอดึงโปรดใช้ข้อตกลงเล็ก ๆ จำนวนมากข้อตกลงที่ยิ่งใหญ่ มันทำให้ง่ายต่อการผสานเมื่อมีคำขอดึงหลายอย่างที่ต้องรวมกันสำหรับเวอร์ชันใหม่
หากคุณพบว่าห้องสมุดนี้มีประโยชน์คุณจะพบว่าเครื่องมืออื่น ๆ นี้มีประโยชน์อย่างแน่นอน:
Watchdog: https://watchdogforxcode.com/
นอกจากนี้โปรดตรวจสอบโครงการอื่น ๆ ของฉัน:
บันทึกการเปลี่ยนแปลงอยู่ในไฟล์ของตัวเอง: changelog.md