也可以将 swift println 日志写入文件吗?
Possible to write swift println logs into file too?
将日志写入文本文件也是一种简单的方法吗?当出现问题时,我需要一个崩溃日志来分析。但是我已经在代码中使用了 println。
使用String.writeToFile(<#path: String#>, atomically: <#Bool#>, encoding: <#NSStringEncoding#>, error: <#NSErrorPointer#>)
您可以添加:
#if DEBUG
func println(s:String) {
var error:NSError? = nil
let path = "/Users/<me>/dump.txt"
var dump = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)!
"\(dump)\n\(s)".writeToFile(path, atomically:true, encoding:NSUTF8StringEncoding, error:&error)
}
#endif
请参阅有关如何使用此编译器标志的 #if DEBUG 答案。
遗憾的是,使用基于 println()
的解决方案不会导致输出被 Apple 系统日志 (ASL) 捕获。
ASL 是由 Mac OS 和 iOS 提供的日志工具,由 NSLog()
使用(在 Mac 上可见通过控制台应用程序)。因为 NSLog()
使用 ASL,所以 NSLog()
记录的日志条目将通过设备控制台可见。通过 println()
记录的消息将不会在 ASL 中捕获,因此,在发生某些事情后,没有机会返回控制台进行诊断。
The CleanroomLogger open-source project 提供了一个可扩展的 Swift API,您可以使用它来做您想做的事情。除了 ASLLogRecorder
.
之外,您只需实施 LogRecorder
并在配置中指定它
对于 swift 3,像这样更改 Thomas Killan 的代码
func println(s:String) {
let path = "/Users/<me>/dump.txt"
var dump = ""
if FileManager.default.fileExists(atPath: path) {
dump = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)
}
do {
// Write to the file
try "\(dump)\n\(s)".write(toFile: path, atomically: true, encoding: String.Encoding.utf8)
} catch let error as NSError {
print("Failed writing to log file: \(path), Error: " + error.localizedDescription)
}
}
我稍微修改了你的功能,使其成为全局功能,并添加了每天保存一个日志。
public func debugPrint(s:String)
{
var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
let dateString = formatter.string(from: Date())
let fileName = "\(dateString).log"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
var dump = ""
if FileManager.default.fileExists(atPath: logFilePath) {
dump = try! String(contentsOfFile: logFilePath, encoding: String.Encoding.utf8)
}
do {
// Write to the file
try "\(dump)\n\(Date()):\(s)".write(toFile: logFilePath, atomically: true, encoding: String.Encoding.utf8)
} catch let error as NSError {
print("Failed writing to log file: \(logFilePath), Error: " + error.localizedDescription)
}
}
将日志写入文本文件也是一种简单的方法吗?当出现问题时,我需要一个崩溃日志来分析。但是我已经在代码中使用了 println。
使用String.writeToFile(<#path: String#>, atomically: <#Bool#>, encoding: <#NSStringEncoding#>, error: <#NSErrorPointer#>)
您可以添加:
#if DEBUG
func println(s:String) {
var error:NSError? = nil
let path = "/Users/<me>/dump.txt"
var dump = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)!
"\(dump)\n\(s)".writeToFile(path, atomically:true, encoding:NSUTF8StringEncoding, error:&error)
}
#endif
请参阅有关如何使用此编译器标志的 #if DEBUG 答案。
遗憾的是,使用基于 println()
的解决方案不会导致输出被 Apple 系统日志 (ASL) 捕获。
ASL 是由 Mac OS 和 iOS 提供的日志工具,由 NSLog()
使用(在 Mac 上可见通过控制台应用程序)。因为 NSLog()
使用 ASL,所以 NSLog()
记录的日志条目将通过设备控制台可见。通过 println()
记录的消息将不会在 ASL 中捕获,因此,在发生某些事情后,没有机会返回控制台进行诊断。
The CleanroomLogger open-source project 提供了一个可扩展的 Swift API,您可以使用它来做您想做的事情。除了 ASLLogRecorder
.
LogRecorder
并在配置中指定它
对于 swift 3,像这样更改 Thomas Killan 的代码
func println(s:String) {
let path = "/Users/<me>/dump.txt"
var dump = ""
if FileManager.default.fileExists(atPath: path) {
dump = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)
}
do {
// Write to the file
try "\(dump)\n\(s)".write(toFile: path, atomically: true, encoding: String.Encoding.utf8)
} catch let error as NSError {
print("Failed writing to log file: \(path), Error: " + error.localizedDescription)
}
}
我稍微修改了你的功能,使其成为全局功能,并添加了每天保存一个日志。
public func debugPrint(s:String)
{
var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
let dateString = formatter.string(from: Date())
let fileName = "\(dateString).log"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
var dump = ""
if FileManager.default.fileExists(atPath: logFilePath) {
dump = try! String(contentsOfFile: logFilePath, encoding: String.Encoding.utf8)
}
do {
// Write to the file
try "\(dump)\n\(Date()):\(s)".write(toFile: logFilePath, atomically: true, encoding: String.Encoding.utf8)
} catch let error as NSError {
print("Failed writing to log file: \(logFilePath), Error: " + error.localizedDescription)
}
}