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