ios - print - प्रमाणन प्राधिकरण




लॉगिंग विधि हस्ताक्षर का उपयोग कर तेजी से (11)

इसे इस्तेमाल करे:

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 (e.g., __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
    }
}

लॉग इन करें:

let x = 100
Log.msg("My output message \(x)")

मैं अपने लॉगिंग वर्ग को फिर से लिखने की कोशिश कर रहा हूं और मैं जानना चाहूंगा कि विधि कॉल को ट्रैक करने के लिए एक स्विफ्ट फ़ाइल में PRETTY_FUNCTION या NSStringFromSelector (_cmd) को कैसे स्थानापन्न करें?


एक नया पुस्तकालय https://github.com/DaveWoodCom/XCGLogger जिसे मैंने अभी प्रकाशित किया है: https://github.com/DaveWoodCom/XCGLogger

यह स्विफ्ट के लिए एक डीबग लॉगिंग लाइब्रेरी है।

#function मैक्रोज़ का उपयोग करने में सक्षम होने के लिए, उन्हें अपने लॉगिंग फ़ंक्शन के लिए डिफ़ॉल्ट मान के रूप में सेट करना है। संकलक तब अपेक्षित मूल्यों का उपयोग करके उन्हें भर देगा।

func log(logMessage: String, functionName: String = #function) {
    print("\(functionName): \(logMessage)")
}

तो बस कॉल करें:

log("my message")

और यह उम्मीद के अनुसार काम करता है जैसे कि आप कुछ दे रहे हैं:

whateverFunction(): my message

यह कैसे काम करता है इसके बारे में अधिक जानकारी: https://www.cerebralgardens.com/blog/entry/2014/06/09/the-first-essential-swift-3rd-party-library-to-include-in-your-project


दिनांक 3, फ़ंक्शन नाम, फ़ाइल नाम, पंक्ति संख्या के साथ स्विफ्ट 3 समर्थन डिबगलॉग ऑब्जेक्ट:

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")
}

मेरे द्वारा प्रकाशित एक नया पुस्तकालय है: Printer

आपको कई तरीकों से लॉग इन करने देना है।

एक सफलता संदेश लॉग करने के लिए:

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

डिस्क्लेमर : यह लाइब्रेरी मेरे द्वारा बनाई गई है।


यह आपको एक ही बार में क्लास और फंक्शन का नाम देगा:

var name = NSStringFromClass(self.classForCoder) + "." + __FUNCTION__

यह केवल डिबग मोड में प्रिंट होगा:

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"

यहाँ मेरा इस पर ले रहा है।

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")}

उम्मीद करता हु आपको आनंद मिला हो।


यहाँ मैं क्या इस्तेमाल किया है: 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)
}

स्विफ्ट 3 और उससे अधिक के लिए:

print("\(#function)")

स्विफ्ट 4, इन सभी भयानक उत्तरों के आधार पर। ❤️

/*
 That's how I protect my virginity.
*/

import Foundation

/// Based on [this SO question](https://.com/questions/24048430/logging-method-signature-using-swift).
class Logger {

    // MARK: - Lifecycle

    private init() {} // Disallows direct instantiation e.g.: "Logger()"

    // MARK: - Logging

    class func log(_ message: Any = "",
                   withEmoji: Bool = true,
                   filename: String = #file,
                   function: String =  #function,
                   line: Int = #line) {

        if withEmoji {
            let body = emojiBody(filename: filename, function: function, line: line)
            emojiLog(messageHeader: emojiHeader(), messageBody: body)

        } else {
            let body = regularBody(filename: filename, function: function, line: line)
            regularLog(messageHeader: regularHeader(), messageBody: body)
        }

        let messageString = String(describing: message)
        guard !messageString.isEmpty else { return }
        print(" └ 📣 \(messageString)\n")
    }
}

// MARK: - Private

// MARK: Emoji

private extension Logger {

    class func emojiHeader() -> String {
        return "⏱ \(formattedDate())"
    }

    class func emojiBody(filename: String, function: String, line: Int) -> String {
        return "🗂 \(filenameWithoutPath(filename: filename)), in 🔠 \(function) at #️⃣ \(line)"
    }

    class func emojiLog(messageHeader: String, messageBody: String) {
        print("\(messageHeader) │ \(messageBody)")
    }
}

// MARK: Regular

private extension Logger {

    class func regularHeader() -> String {
        return " \(formattedDate()) "
    }

    class func regularBody(filename: String, function: String, line: Int) -> String {
        return " \(filenameWithoutPath(filename: filename)), in \(function) at \(line) "
    }

    class func regularLog(messageHeader: String, messageBody: String) {
        let headerHorizontalLine = horizontalLine(for: messageHeader)
        let bodyHorizontalLine = horizontalLine(for: messageBody)

        print("┌\(headerHorizontalLine)┬\(bodyHorizontalLine)┐")
        print("│\(messageHeader)│\(messageBody)│")
        print("└\(headerHorizontalLine)┴\(bodyHorizontalLine)┘")
    }

    /// Returns a `String` composed by horizontal box-drawing characters (─) based on the given message length.
    ///
    /// For example:
    ///
    ///     " ViewController.swift, in viewDidLoad() at 26 " // Message
    ///     "──────────────────────────────────────────────" // Returned String
    ///
    /// Reference: [U+250x Unicode](https://en.wikipedia.org/wiki/Box-drawing_character)
    class func horizontalLine(for message: String) -> String {
        return Array(repeating: "─", count: message.count).joined()
    }
}

// MARK: Util

private extension Logger {

    /// "/Users/blablabla/Class.swift" becomes "Class.swift"
    class func filenameWithoutPath(filename: String) -> String {
        return URL(fileURLWithPath: filename).lastPathComponent
    }

    /// E.g. `15:25:04.749`
    class func formattedDate() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "HH:mm:ss.SSS"
        return "\(dateFormatter.string(from: Date()))"
    }
}

Logger.log() - (इमोजी डिफ़ॉल्ट रूप से चालू है) के साथ कॉल करना:

Logger.log(withEmoji: false) साथ कॉल करना:

अधिक उपयोग उदाहरण:

Logger.log()
Logger.log(withEmoji: false)
Logger.log("I'm a virgin.")
Logger.log("I'm a virgin.", withEmoji: false)
Logger.log(NSScreen.min.frame.maxX) // Can handle "Any" (not only String).

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)")
}




ios8