| // Copyright 2016 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| import Foundation |
| |
| public let log = VLogger() |
| |
| public struct VLogger { |
| public func debug(@autoclosure closure: () -> String, functionName: String = #function, fileName: String = #file, lineNumber: Int = #line) { |
| log("DEBUG", str: closure(), functionName: functionName, fileName: fileName, lineNumber: lineNumber) |
| } |
| |
| public func info(@autoclosure closure: () -> String, functionName: String = #function, fileName: String = #file, lineNumber: Int = #line) { |
| log("INFO", str: closure(), functionName: functionName, fileName: fileName, lineNumber: lineNumber) |
| } |
| |
| public func warning(@autoclosure closure: () -> String, functionName: String = #function, fileName: String = #file, lineNumber: Int = #line) { |
| log("WARN", str: closure(), functionName: functionName, fileName: fileName, lineNumber: lineNumber) |
| } |
| |
| public func error(@autoclosure closure: () -> String, functionName: String = #function, fileName: String = #file, lineNumber: Int = #line) { |
| log("ERROR", str: closure(), functionName: functionName, fileName: fileName, lineNumber: lineNumber) |
| } |
| |
| public func fatal(@autoclosure closure: () -> String, functionName: String = #function, fileName: String = #file, lineNumber: Int = #line) { |
| log("FATAL", str: closure(), functionName: functionName, fileName: fileName, lineNumber: lineNumber) |
| } |
| |
| private func log(level:String, str:String, functionName: String = #function, fileName: String = #file, lineNumber: Int = #line) { |
| if let threadName = NSThread.currentThread().name where threadName != "" { |
| print("[", level, "] ", (fileName as NSString).lastPathComponent, ":", lineNumber, " (", threadName, ") ", str, separator: "") |
| } else { |
| print("[", level, "] ", (fileName as NSString).lastPathComponent, ":", lineNumber, " ", str, separator: "") |
| } |
| } |
| } |
| |
| public enum VLogLevel: Int { |
| case Info = 0 |
| case Warning = 1 |
| case Error = 2 |
| case Fatal = 3 |
| } |
| |
| public struct VLoggingOptions { |
| /// Enable V-leveled logging at the specified level. |
| let level: VLogLevel |
| |
| /// The syntax of the argument is a comma-separated list of pattern=N, |
| /// where pattern is a literal file name (minus the ".go" suffix) or |
| /// "glob" pattern and N is a V level. For instance, gopher*=3 |
| /// sets the V level to 3 in all Go files whose names begin "gopher". |
| let moduleSpec: String? |
| |
| // We only log to disk on OS X |
| #if os(OSX) |
| /// If true, logs are written to standard error instead of to files |
| let logToStderrOnly: Bool |
| |
| /// Log files will be wirtten to this directory instead of the default temp dir |
| let logDir: String? |
| #endif |
| |
| #if os(OSX) |
| public init(level:VLogLevel=VLogLevel.Info, |
| moduleSpec:String?=nil, |
| logToStderrOnly:Bool=true, |
| logDir:String?=nil) { |
| self.level = level |
| self.moduleSpec = moduleSpec |
| self.logToStderrOnly = logToStderrOnly |
| self.logDir = logDir |
| if (self.logToStderrOnly && self.logDir != nil) { |
| NSLog("WARNING: logToStderrOnly set to true and logDir was set -- only logging to stderr and not to disk.") |
| } |
| } |
| #else |
| public init(level:VLogLevel=VLogLevel.Info, moduleSpec:String?=nil) { |
| self.level = level |
| self.moduleSpec = moduleSpec |
| } |
| #endif |
| |
| /// Call the init logging function in go -- INTERNAL ONLY |
| internal func initGo() throws { |
| #if os(OSX) |
| try SwiftVError.catchAndThrowError({ errPtr in |
| swift_io_v_v23_V_nativeInitLogging( |
| logDir?.toGo() ?? nil, |
| logToStderrOnly.toGo(), |
| level.rawValue.toGo(), |
| moduleSpec?.toGo() ?? nil, |
| errPtr) |
| }) |
| #else |
| try SwiftVError.catchAndThrowError({ errPtr in |
| swift_io_v_v23_V_nativeInitLogging(nil, 1, // no logging to disk |
| level.rawValue.toGo(), moduleSpec?.toGo() ?? nil, errPtr) |
| }) |
| #endif |
| } |
| } |