使用swiftlogging方法签名
我想重写我的日志类,我想知道如何replacePRETTY_FUNCTION或NSStringFromSelector(_cmd)在一个SWIFT文件,以追踪方法调用?
看看我刚发布的一个新库: https : //github.com/DaveWoodCom/XCGLogger
这是一个Swift的debugging日志库。
能够使用# #function
macros的关键是将它们设置为日志loggingfunction的默认值。 编译器将使用期望的值填充它们。
func log(logMessage: String, functionName: String = #function) { print("\(functionName): \(logMessage)") }
然后,只需拨打:
log("my message")
它按预期的方式工作,给你如下的东西:
whateverFunction(): my message
有关如何工作的更多信息: http : //www.cerebralgardens.com/blog/entry/2014/06/09/the-first-essential-swift-3rd-party-library-to-include-in-your-project
快速特别的文字如下(从[快速指南]
#file
string它出现的文件的名称。
#line
Int显示的行号。
#column
Int开始的列号。
#function
string它出现的声明的名字。
在Swift 2.2b4之前 ,这些是
__FILE__
string它出现的文件的名称。
__LINE__
Int显示的行号。
__COLUMN__
Int它开始的列号。
__FUNCTION__
string它出现的声明的名称。
你可以在日志语句中使用这些:
println("error occurred on line \(__LINE__) in function \(__FUNCTION__)")
我会使用这样的东西:
func Log(message: String = "", _ path: String = __FILE__, _ function: String = __FUNCTION__) { let file = path.componentsSeparatedByString("/").last!.componentsSeparatedByString(".").first! // Sorry NSLog("\(file).\(function): \(message)") }
与以前的答案相比有所改进:
- 使用NSLog,而不是print / println
- 不使用string不可用的lastPathComponent
- 日志消息是可选的
尝试这个:
class Log { class func msg(message: String, functionName: String = __FUNCTION__, fileNameWithPath: String = __FILE__, lineNumber: Int = __LINE__ ) { // In the default arguments to this function: // 1) If I use a String type, the macros (eg, __LINE__) don't expand at run time. // "\(__FUNCTION__)\(__FILE__)\(__LINE__)" // 2) A tuple type, like, // typealias SMLogFuncDetails = (String, String, Int) // SMLogFuncDetails = (__FUNCTION__, __FILE__, __LINE__) // doesn't work either. // 3) This String = __FUNCTION__ + __FILE__ // also doesn't work. var fileNameWithoutPath = fileNameWithPath.lastPathComponent #if DEBUG let output = "\(NSDate()): \(message) [\(functionName) in \(fileNameWithoutPath), line \(lineNumber)]" println(output) #endif } }
logging使用:
let x = 100 Log.msg("My output message \(x)")
这是我用在: https : //github.com/goktugyil/QorumLogs
它像XCGLogger,但更好。
func myLog<T>(object: T, _ file: String = __FILE__, _ function: String = __FUNCTION__, _ line: Int = __LINE__) { let info = "\(file).\(function)[\(line)]:\(object)" print(info) }
对于Swift 3及以上版本:
print("\(#function)")
从Swift 2.2开始,您可以使用Literal Expressions
来指定它,如Swift编程语言指南中所述 。
所以,如果你有一个Logger
结构,有一个函数logging错误发生的地方,那么你可以这样调用它:
Logger().log(message, fileName: #file, functionName: #function, atLine: #line)
这将一举拿下你的课程和function名称:
var name = NSStringFromClass(self.classForCoder) + "." + __FUNCTION__
这将只在debugging模式下打印:
func debugLog(text: String, fileName: String = __FILE__, function: String = __FUNCTION__, line: Int = __LINE__) { debugPrint("[\((fileName as NSString).lastPathComponent), in \(function)() at line: \(line)]: \(text)") }
结果:
"[Book.swift, in addPage() at line: 33]: Page added with success"
Swift 3支持带date,函数名,文件名,行号的debugLog对象:
public func debugLog(object: Any, functionName: String = #function, fileName: String = #file, lineNumber: Int = #line) { let className = (fileName as NSString).lastPathComponent print("\(NSDate()): <\(className)> \(functionName) [#\(lineNumber)]| \(object)\n") }
有一个我已经出版的新图书馆: 打印机 。
它有许多function让你login不同的方式。
要logging成功消息:
Printer.log.success(details: "This is a Success message.")
输出:
Printer ➞ [✅ Success] [⌚04-27-2017 10:53:28] ➞ ✹✹This is a Success message.✹✹ [Trace] ➞ ViewController.swift ➞ viewDidLoad() #58
免责声明 :这个图书馆是由我创build的。
这似乎在迅速3.1工作正常
print("File: \((#file as NSString).lastPathComponent) Func: \(#function) Line: \(#line)")
这是我的承诺。
func Log<T>(_ object: Shit, _ file: String = #file, _ function: String = #function, _ line: Int = #line) { var filename = (file as NSString).lastPathComponent filename = filename.components(separatedBy: ".")[0] let currentDate = Date() let df = DateFormatter() df.dateFormat = "HH:mm:ss.SSS" print("┌──────────────┬───────────────────────────────────────────────────────────────") print("│ \(df.string(from: currentDate)) │ \(filename).\(function) (\(line))") print("└──────────────┴───────────────────────────────────────────────────────────────") print(" \(object)\n")}
希望你喜欢。
func Log<T>(_ object: T, fileName: String = #file, function: String = #function, line: Int = #line) { NSLog("\((fileName as NSString).lastPathComponent), in \(function) at line: \(line): \(object)") }