159 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Swift
		
	
	
		
		
			
		
	
	
			159 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Swift
		
	
	
|  | // | ||
|  | //  Logger.swift | ||
|  | //  GuruAnalyticsLib | ||
|  | // | ||
|  | //  Created by mayue on 2022/12/21. | ||
|  | // | ||
|  | 
 | ||
|  | import Foundation | ||
|  | import SwiftyBeaver | ||
|  | import CryptoSwift | ||
|  | import RxSwift | ||
|  | 
 | ||
|  | internal class LoggerManager { | ||
|  |      | ||
|  |     private static let password: String = "Castbox123" | ||
|  |      | ||
|  |     private lazy var logger: SwiftyBeaver.Type = { | ||
|  |         let logger = SwiftyBeaver.self | ||
|  |         logger.addDestination(consoleOutputDestination) | ||
|  |         logger.addDestination(fileOutputDestination) | ||
|  |         return logger | ||
|  |     }() | ||
|  |      | ||
|  |     private lazy var logFileDir: URL = { | ||
|  |         let baseDir = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! | ||
|  |         return baseDir.appendingPathComponent("GuruAnalytics/Logs/\(logCategoryName)/", isDirectory: true) | ||
|  |     }() | ||
|  |      | ||
|  |     private lazy var consoleOutputDestination: ConsoleDestination = { | ||
|  |         let d = ConsoleDestination() | ||
|  |         return d | ||
|  |     }() | ||
|  |      | ||
|  |     private lazy var fileOutputDestination: FileDestination = { | ||
|  |         let file = FileDestination() | ||
|  |         let dateFormatter = DateFormatter() | ||
|  |         dateFormatter.dateFormat = "yyyy-MM-dd" | ||
|  |         let dateString = dateFormatter.string(from: Date()) | ||
|  |         file.logFileURL = logFileDir.appendingPathComponent("\(dateString).log", isDirectory: false) | ||
|  |         file.asynchronously = true | ||
|  |         return file | ||
|  |     }() | ||
|  |      | ||
|  |     private let logCategoryName: String | ||
|  |      | ||
|  |     internal init(logCategoryName: String) { | ||
|  |         self.logCategoryName = logCategoryName | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | internal extension LoggerManager { | ||
|  |      | ||
|  |     func logFilesZipArchive() -> Single<URL?> { | ||
|  |          | ||
|  |         return Single.create { subscriber in | ||
|  |             subscriber(.success(nil)) | ||
|  |             return Disposables.create() | ||
|  |         } | ||
|  |         .observe(on: MainScheduler.asyncInstance) | ||
|  |     } | ||
|  |      | ||
|  |     func logFilesDirURL() -> Single<URL?> { | ||
|  |          | ||
|  |         return Single.create { subscriber in | ||
|  |              | ||
|  |             DispatchQueue.global().async { [weak self] in | ||
|  |                 guard let `self` = self else { | ||
|  |                     subscriber(.failure( | ||
|  |                         NSError(domain: "loggerManager", code: 0, userInfo: [NSLocalizedDescriptionKey : "manager is released"]) | ||
|  |                     )) | ||
|  |                     return | ||
|  |                 } | ||
|  |                  | ||
|  |                 do { | ||
|  |                     let filePaths = try FileManager.default.contentsOfDirectory(at: self.logFileDir, | ||
|  |                                                                                 includingPropertiesForKeys: nil, | ||
|  |                                                                                 options: [.skipsHiddenFiles]) | ||
|  |                         .filter { $0.pathExtension == "log" } | ||
|  |                         .map { $0.path } | ||
|  | 
 | ||
|  |                     guard filePaths.count > 0 else { | ||
|  |                         subscriber(.success(nil)) | ||
|  |                         return | ||
|  |                     } | ||
|  |                     subscriber(.success(self.logFileDir)) | ||
|  |                 } catch { | ||
|  |                     subscriber(.failure(error)) | ||
|  |                 } | ||
|  |                  | ||
|  |             } | ||
|  |              | ||
|  |             return Disposables.create() | ||
|  |         } | ||
|  |         .observe(on: MainScheduler.asyncInstance) | ||
|  |     } | ||
|  |      | ||
|  |     func clearAllLogFiles() { | ||
|  |          | ||
|  |         DispatchQueue.global().async { [weak self] in | ||
|  |             guard let `self` = self else { return } | ||
|  |             if let files = try? FileManager.default.contentsOfDirectory(at: self.logFileDir, includingPropertiesForKeys: [], options: [.skipsHiddenFiles]) { | ||
|  |                 files.forEach { url in | ||
|  |                     do { | ||
|  |                         try FileManager.default.removeItem(at: url) | ||
|  |                     } catch  { | ||
|  |                         cdPrint("remove file: \(url.path) \n error: \(error)") | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |          | ||
|  |     } | ||
|  |      | ||
|  |     func verbose(_ message: Any, | ||
|  |                  _ file: String = #file, | ||
|  |                  _ function: String = #function, | ||
|  |                  line: Int = #line, | ||
|  |                  context: Any? = nil) { | ||
|  |         guard GuruAnalytics.loggerDebug else { return } | ||
|  |         logger.verbose(message, file, function, line: line, context: context) | ||
|  |     } | ||
|  |      | ||
|  |     func debug(_ message: Any, | ||
|  |                _ file: String = #file, | ||
|  |                _ function: String = #function, | ||
|  |                line: Int = #line, | ||
|  |                context: Any? = nil) { | ||
|  |         guard GuruAnalytics.loggerDebug else { return } | ||
|  |         logger.debug(message, file, function, line: line, context: context) | ||
|  |     } | ||
|  |      | ||
|  |     func info(_ message: Any, | ||
|  |               _ file: String = #file, | ||
|  |               _ function: String = #function, | ||
|  |               line: Int = #line, | ||
|  |               context: Any? = nil) { | ||
|  |         guard GuruAnalytics.loggerDebug else { return } | ||
|  |         logger.info(message, file, function, line: line, context: context) | ||
|  |     } | ||
|  |      | ||
|  |     func warning(_ message: Any, | ||
|  |                  _ file: String = #file, | ||
|  |                  _ function: String = #function, | ||
|  |                  line: Int = #line, | ||
|  |                  context: Any? = nil) { | ||
|  |         guard GuruAnalytics.loggerDebug else { return } | ||
|  |         logger.warning(message, file, function, line: line, context: context) | ||
|  |     } | ||
|  |      | ||
|  |     func error(_ message: Any, | ||
|  |                _ file: String = #file, | ||
|  |                _ function: String = #function, | ||
|  |                line: Int = #line, | ||
|  |                context: Any? = nil) { | ||
|  |         guard GuruAnalytics.loggerDebug else { return } | ||
|  |         logger.error(message, file, function, line: line, context: context) | ||
|  |     } | ||
|  | } |