Logger.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //
  2. // Logger.swift
  3. // SwiftBilibili
  4. //
  5. // Created by 罗文 on 2021/1/13.
  6. // Copyright © 2021年 罗文. All rights reserved.
  7. //
  8. import CocoaLumberjack
  9. extension DDLogFlag {
  10. public var level: String {
  11. switch self {
  12. case DDLogFlag.error: return "❤️ ERROR"
  13. case DDLogFlag.warning: return "💛 WARNING"
  14. case DDLogFlag.info: return "💙 INFO"
  15. case DDLogFlag.debug: return "💚 DEBUG"
  16. case DDLogFlag.verbose: return "💜 VERBOSE"
  17. default: return "☠️ UNKNOWN"
  18. }
  19. }
  20. }
  21. private class LogFormatter: NSObject, DDLogFormatter {
  22. static let dateFormatter = DateFormatter().then {
  23. $0.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
  24. }
  25. public func format(message logMessage: DDLogMessage) -> String? {
  26. let timestamp = LogFormatter.dateFormatter.string(from: logMessage.timestamp)
  27. let level = logMessage.flag.level
  28. let filename = logMessage.fileName
  29. let function = logMessage.function ?? ""
  30. let line = logMessage.line
  31. let message = logMessage.message.components(separatedBy: "\n").joined(separator: "\n ")
  32. return "\(timestamp) \(level) \(filename).\(function):\(line) - \(message)"
  33. }
  34. private func formattedDate(from date: Date) -> String {
  35. return LogFormatter.dateFormatter.string(from: date)
  36. }
  37. }
  38. /// A shared instance of `Logger`.
  39. let log = Logger()
  40. final class Logger {
  41. // MARK: Initialize
  42. init() {
  43. setenv("XcodeColors", "YES", 0)
  44. // TTY = Xcode console
  45. DDTTYLogger.sharedInstance?.do {
  46. $0.logFormatter = LogFormatter()
  47. $0.colorsEnabled = false /*true*/ // Note: doesn't work in Xcode 8
  48. $0.setForegroundColor(DDMakeColor(30, 121, 214), backgroundColor: nil, for: .info)
  49. $0.setForegroundColor(DDMakeColor(50, 143, 72), backgroundColor: nil, for: .debug)
  50. DDLog.add($0)
  51. }
  52. // File logger
  53. DDFileLogger().do {
  54. $0.rollingFrequency = TimeInterval(60 * 60 * 24) // 24 hours
  55. $0.logFileManager.maximumNumberOfLogFiles = 7
  56. DDLog.add($0)
  57. }
  58. }
  59. // MARK: Logging
  60. func error(
  61. _ items: Any...,
  62. file: StaticString = #file,
  63. function: StaticString = #function,
  64. line: UInt = #line
  65. ) {
  66. let message = self.message(from: items)
  67. DDLogError(message, file: file, function: function, line: line)
  68. }
  69. func warning(
  70. _ items: Any...,
  71. file: StaticString = #file,
  72. function: StaticString = #function,
  73. line: UInt = #line
  74. ) {
  75. let message = self.message(from: items)
  76. DDLogWarn(message, file: file, function: function, line: line)
  77. }
  78. func info(
  79. _ items: Any...,
  80. file: StaticString = #file,
  81. function: StaticString = #function,
  82. line: UInt = #line
  83. ) {
  84. let message = self.message(from: items)
  85. DDLogInfo(message, file: file, function: function, line: line)
  86. }
  87. func debug(
  88. _ items: Any...,
  89. file: StaticString = #file,
  90. function: StaticString = #function,
  91. line: UInt = #line
  92. ) {
  93. let message = self.message(from: items)
  94. DDLogDebug(message, file: file, function: function, line: line)
  95. }
  96. func verbose(
  97. _ items: Any...,
  98. file: StaticString = #file,
  99. function: StaticString = #function,
  100. line: UInt = #line
  101. ) {
  102. let message = self.message(from: items)
  103. DDLogVerbose(message, file: file, function: function, line: line)
  104. }
  105. // MARK: Utils
  106. private func message(from items: [Any]) -> String {
  107. return items
  108. .map { String(describing: $0) }
  109. .joined(separator: " ")
  110. }
  111. }