Swift:
การเขียนไปยังข้อผิดพลาดมาตรฐาน
วิธีการ:
ใน Swift, การเขียนไปยัง standard error สามารถทำได้โดยใช้คลาส FileHandle
เพื่อเข้าถึง stderr โดยตรง ต่อไปนี้เป็นตัวอย่างง่ายๆ:
import Foundation
// กำหนดข้อความผิดพลาด
let errorMessage = "เกิดข้อผิดพลาด\n"
// แปลงข้อความเป็นข้อมูล
if let data = errorMessage.data(using: .utf8) {
// เขียนข้อความผิดพลาดไปยัง stderr
FileHandle.standardError.write(data)
}
ผลลัพธ์ที่ stderr (โดยปกติจะดูในคอนโซลหรือเทอร์มินัล):
เกิดข้อผิดพลาด
สำหรับการบันทึกที่ซับซ้อนยิ่งขึ้นหรือเมื่อทำงานกับไลบรารีภายนอก คุณอาจพิจารณาใช้ไลบรารี่ของบุคคลที่สามเช่น SwiftLog แม้ว่า SwiftLog อาจไม่ได้เขียนไปยัง stderr โดยตรงจากกล่อง คุณสามารถทำการปรับแต่ง backend การบันทึกเพื่อบรรลุเรื่องนี้ได้ ต่อไปนี้เป็นตัวอย่างการกำหนด custom log handler ที่เขียนไปยัง stderr:
ก่อนอื่น ให้เพิ่ม SwiftLog ไปยังการพึ่งพาโปรเจคของคุณใน Package.swift
:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "YourPackageName",
dependencies: [
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
],
targets: [
.target(
name: "YourTargetName",
dependencies: [
.product(name: "Logging", package: "swift-log"),
]),
]
)
จากนั้น ให้ทำการปรับแต่ง custom log handler ที่เขียนไปยัง stderr:
import Logging
import Foundation
struct StderrLogHandler: LogHandler {
let label: String
var logLevel: Logger.Level = .info
func log(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, source: String, file: String, function: String, line: UInt) {
let output = "\(message)\n"
if let data = output.data(using: .utf8) {
FileHandle.standardError.write(data)
}
}
subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? {
get { return nil }
set(newValue) { }
}
var metadata: Logger.Metadata {
get { return [:] }
set(newMetadata) { }
}
}
// การใช้งาน
LoggingSystem.bootstrap(StderrLogHandler.init)
let logger = Logger(label: "com.example.yourapp")
logger.error("นี่คือข้อความแสดงข้อผิดพลาด")
ผลลัพธ์ที่ stderr:
นี่คือข้อความแสดงข้อผิดพลาด
Handler ที่กำหนดเองนี้ช่วยให้คุณสามารถนำข้อความผิดพลาดจาก SwiftLog ไปยัง standard error โดยตรง รวมอย่างไม่มีรอยต่อกับข้อความบันทึกอื่นๆ ที่แอพพลิเคชั่นของคุณอาจสร้างขึ้น