Swift中的CocoaLumberjack,如何打印行号和文件名
CocoaLumberjack in Swift, how to print line number and filne name
我是 CocoaLumberjack 的新手,我在 this 之后的 Swift 上开始使用它。如果我尝试打印日志:
DDLogDebug("Debug")
DDLogInfo("Info")
DDLogWarn("Warning")
DDLogVerbose("Verbose")
DDLogError("Error")
一切正常,我打印了所有级别,因为我的 defaultDebugLevel
是 DDLogLevel.Verbose。
但我无法find/find知道如何打印日志中的行或文件名。有什么想法吗?
非常感谢!!
经过更多研究,我发现你必须创建一个日志格式化程序,这个日志格式化程序是 DDDispatchQueueLogFormatter
的子类,你必须重写一个接收 DDLogMessage
和 returns一个String
,例如:
import Foundation
import CocoaLumberjack.DDDispatchQueueLogFormatter
class LogFormatter: DDDispatchQueueLogFormatter {
let dateFormatter: NSDateFormatter
override init() {
dateFormatter = NSDateFormatter()
dateFormatter.formatterBehavior = .Behavior10_4
dateFormatter.dateFormat = "HH:mm"
super.init()
}
override func formatLogMessage(logMessage: DDLogMessage!) -> String {
let dateAndTime = dateFormatter.stringFromDate(logMessage.timestamp)
return "\(dateAndTime) [\(logMessage.fileName):\(logMessage.line)]: \(logMessage.message)"
}
}
然后你只需要像这样在你的 AppDelegate 或任何你设置 CocaLumberJack 的地方添加你的格式化程序:
DDTTYLogger.sharedInstance().logFormatter = LogFormatter()
希望对大家有所帮助!
Andres 的回答更新为 Swift 3(Hugh 对日期时间格式进行了细微调整)
import Foundation
import CocoaLumberjack.DDDispatchQueueLogFormatter
class LogFormatter: DDDispatchQueueLogFormatter {
let dateFormatter: DateFormatter
override init() {
dateFormatter = DateFormatter()
dateFormatter.formatterBehavior = .behavior10_4
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss:SSS"
super.init()
}
override func format(message: DDLogMessage!) -> String {
let dateAndTime = dateFormatter.string(from: message.timestamp)
return "\(dateAndTime) [\(message.fileName!) \(message.function!):\(message.line)] \(message.message ?? "")"
}
}
CocoaLumberjack (3.1.0)
更新:
import CocoaLumberjack.DDLog
class LogFormatter: NSObject, DDLogFormatter {
let dateFormatter: DateFormatter
override init() {
dateFormatter = DateFormatter()
dateFormatter.formatterBehavior = .behavior10_4
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss:SSS"
super.init()
}
func format(message logMessage: DDLogMessage) -> String? {
let dateAndTime = dateFormatter.string(from: logMessage.timestamp)
return "\(dateAndTime) [\(logMessage.fileName):\(logMessage.line)]: \(logMessage.message)"
}
}
DDTTYLogger.sharedInstance.logFormatter = LogFormatter()
#import "CustomFormatter.h"
@implementation CustomFormatter : NSObject
- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
NSString *logLevel;
switch (logMessage->_flag) {
case DDLogFlagError : logLevel = @"[E]"; break;
case DDLogFlagWarning : logLevel = @"[W]"; break;
case DDLogFlagInfo : logLevel = @"[I]"; break;
case DDLogFlagDebug : logLevel = @"[D]"; break;
default : logLevel = @"[V]"; break;
}
return [NSString stringWithFormat:@"%@:%lu %@ | %@ ", logMessage->_fileName, (unsigned long)logMessage->_line, logLevel, logMessage->_message];
}
@end
我是 CocoaLumberjack 的新手,我在 this 之后的 Swift 上开始使用它。如果我尝试打印日志:
DDLogDebug("Debug")
DDLogInfo("Info")
DDLogWarn("Warning")
DDLogVerbose("Verbose")
DDLogError("Error")
一切正常,我打印了所有级别,因为我的 defaultDebugLevel
是 DDLogLevel.Verbose。
但我无法find/find知道如何打印日志中的行或文件名。有什么想法吗?
非常感谢!!
经过更多研究,我发现你必须创建一个日志格式化程序,这个日志格式化程序是 DDDispatchQueueLogFormatter
的子类,你必须重写一个接收 DDLogMessage
和 returns一个String
,例如:
import Foundation
import CocoaLumberjack.DDDispatchQueueLogFormatter
class LogFormatter: DDDispatchQueueLogFormatter {
let dateFormatter: NSDateFormatter
override init() {
dateFormatter = NSDateFormatter()
dateFormatter.formatterBehavior = .Behavior10_4
dateFormatter.dateFormat = "HH:mm"
super.init()
}
override func formatLogMessage(logMessage: DDLogMessage!) -> String {
let dateAndTime = dateFormatter.stringFromDate(logMessage.timestamp)
return "\(dateAndTime) [\(logMessage.fileName):\(logMessage.line)]: \(logMessage.message)"
}
}
然后你只需要像这样在你的 AppDelegate 或任何你设置 CocaLumberJack 的地方添加你的格式化程序:
DDTTYLogger.sharedInstance().logFormatter = LogFormatter()
希望对大家有所帮助!
Andres 的回答更新为 Swift 3(Hugh 对日期时间格式进行了细微调整)
import Foundation
import CocoaLumberjack.DDDispatchQueueLogFormatter
class LogFormatter: DDDispatchQueueLogFormatter {
let dateFormatter: DateFormatter
override init() {
dateFormatter = DateFormatter()
dateFormatter.formatterBehavior = .behavior10_4
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss:SSS"
super.init()
}
override func format(message: DDLogMessage!) -> String {
let dateAndTime = dateFormatter.string(from: message.timestamp)
return "\(dateAndTime) [\(message.fileName!) \(message.function!):\(message.line)] \(message.message ?? "")"
}
}
CocoaLumberjack (3.1.0)
更新:
import CocoaLumberjack.DDLog
class LogFormatter: NSObject, DDLogFormatter {
let dateFormatter: DateFormatter
override init() {
dateFormatter = DateFormatter()
dateFormatter.formatterBehavior = .behavior10_4
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss:SSS"
super.init()
}
func format(message logMessage: DDLogMessage) -> String? {
let dateAndTime = dateFormatter.string(from: logMessage.timestamp)
return "\(dateAndTime) [\(logMessage.fileName):\(logMessage.line)]: \(logMessage.message)"
}
}
DDTTYLogger.sharedInstance.logFormatter = LogFormatter()
#import "CustomFormatter.h"
@implementation CustomFormatter : NSObject
- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
NSString *logLevel;
switch (logMessage->_flag) {
case DDLogFlagError : logLevel = @"[E]"; break;
case DDLogFlagWarning : logLevel = @"[W]"; break;
case DDLogFlagInfo : logLevel = @"[I]"; break;
case DDLogFlagDebug : logLevel = @"[D]"; break;
default : logLevel = @"[V]"; break;
}
return [NSString stringWithFormat:@"%@:%lu %@ | %@ ", logMessage->_fileName, (unsigned long)logMessage->_line, logLevel, logMessage->_message];
}
@end