Skip to content

Commit

Permalink
fix: logging interface to wrap swift-log (#396)
Browse files Browse the repository at this point in the history
  • Loading branch information
wooj2 committed Jan 18, 2022
1 parent 6d90db5 commit 567abc3
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 86 deletions.
88 changes: 47 additions & 41 deletions Packages/ClientRuntime/Sources/Logging/LogAgent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,24 @@
* SPDX-License-Identifier: Apache-2.0.
*/

import AwsCommonRuntimeKit

public protocol LogAgent {
/// name of the struct or class where the logger was instantiated from
var name: String {get}

/// Get or set the configured log level.
var level: LogLevel {get set}
var level: LogAgentLevel {get set}

/// This method is called when a `LogAgent` must emit a log message.
///
/// - parameters:
/// - level: The `LogLevel` the message was logged at.
/// - level: The `LogAgentLevel` the message was logged at.
/// - message: The message to log.
/// - metadata: The metadata associated to this log message as a dictionary
/// - source: The source where the log message originated, for example the logging module.
/// - file: The file the log message was emitted from.
/// - function: The function the log line was emitted from.
/// - line: The line the log message was emitted from.
func log(level: LogLevel,
func log(level: LogAgentLevel,
message: String,
metadata: [String: String]?,
source: String,
Expand All @@ -31,8 +29,16 @@ public protocol LogAgent {
line: UInt)
}

public enum LogAgentLevel: String, Codable, CaseIterable {
case trace
case debug
case info
case warn
case error
case fatal
}

public extension LogAgent {

internal static func currentModule(filePath: String = #file) -> String {
let utf8All = filePath.utf8
return filePath.utf8.lastIndex(of: UInt8(ascii: "/")).flatMap { lastSlash -> Substring? in
Expand All @@ -44,69 +50,69 @@ public extension LogAgent {
} ?? "n/a"
}

/// Log a message passing with the `LogLevel.info` log level.
func info(_ message: String) {
self.log(level: LogLevel.info,
/// Log a message passing with the `.info` log level.
func info(_ message: String, file: String = #file, function: String = #function, line: UInt = #line) {
self.log(level: .info,
message: message,
metadata: nil,
source: Self.currentModule(),
file: #file,
function: #function,
line: #line)
file: file,
function: function,
line: line)
}

/// Log a message passing with the `LogLevel.warn` log level.
func warn(_ message: String) {
self.log(level: LogLevel.warn,
func warn(_ message: String, file: String = #file, function: String = #function, line: UInt = #line) {
self.log(level: .warn,
message: message,
metadata: nil,
source: Self.currentModule(),
file: #file,
function: #function,
line: #line)
file: file,
function: function,
line: line)
}

/// Log a message passing with the `LogLevel.debug` log level.
func debug(_ message: String) {
self.log(level: LogLevel.debug,
/// Log a message passing with the `.debug` log level.
func debug(_ message: String, file: String = #file, function: String = #function, line: UInt = #line) {
self.log(level: .debug,
message: message,
metadata: nil,
source: Self.currentModule(),
file: #file,
function: #function,
line: #line)
file: file,
function: function,
line: line)
}

/// Log a message passing with the `LogLevel.error` log level.
func error(_ message: String) {
self.log(level: LogLevel.error,
/// Log a message passing with the `.error` log level.
func error(_ message: String, file: String = #file, function: String = #function, line: UInt = #line) {
self.log(level: .error,
message: message,
metadata: nil,
source: Self.currentModule(),
file: #file,
function: #function,
line: #line)
file: file,
function: function,
line: line)
}

/// Log a message passing with the `LogLevel.trace` log level.
func trace(_ message: String) {
self.log(level: LogLevel.trace,
/// Log a message passing with the `.trace` log level.
func trace(_ message: String, file: String = #file, function: String = #function, line: UInt = #line) {
self.log(level: .trace,
message: message,
metadata: nil,
source: Self.currentModule(),
file: #file,
function: #function,
line: #line)
file: file,
function: function,
line: line)
}

/// Log a message passing with the `LogLevel.fatal` log level.
func fatal(_ message: String) {
self.log(level: LogLevel.fatal,
/// Log a message passing with the `.fatal` log level.
func fatal(_ message: String, file: String = #file, function: String = #function, line: UInt = #line) {
self.log(level: .fatal,
message: message,
metadata: nil,
source: Self.currentModule(),
file: #file,
function: #function,
line: #line)
file: file,
function: function,
line: line)
}
}
94 changes: 49 additions & 45 deletions Packages/ClientRuntime/Sources/Logging/SwiftLog+LogAgent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,62 +4,66 @@
*/

import Logging
import enum AwsCommonRuntimeKit.LogLevel

public typealias SwiftLogger = Logger
public struct SwiftLogger: LogAgent {
private let logger: Logger
private let label: String
private var logLevel: LogAgentLevel

extension SwiftLogger: LogAgent {

public var level: LogLevel {
public init(label: String) {
self.label = label
self.logger = Logger(label: label)
self.logLevel = LogAgentLevel.info
}

public var level: LogAgentLevel {
get {
return LogLevel.fromString(string: logLevel.rawValue)
return logLevel
}
set(value) {
logLevel = Level.init(rawValue: value.stringValue) ?? Level.info
logLevel = value
}
}

public var name: String {
return label
return label
}

public func log(level: LogLevel,
message: String,
metadata: [String: String]?,
source: String,
file: String,
function: String,
line: UInt) {
let mappedDict = metadata?.mapValues { (value) -> MetadataValue in
return MetadataValue.string(value)
public func log(level: LogAgentLevel,
message: String,
metadata: [String: String]?,
source: String,
file: String,
function: String,
line: UInt) {
let mappedDict = metadata?.mapValues { (value) -> Logger.MetadataValue in
return Logger.MetadataValue.string(value)
}
self.log(level: Level.init(rawValue: level.stringValue) ?? Level.info,
Message(stringLiteral: message),
metadata: mappedDict,
source: source)
self.logger.log(level: logLevel.toLoggerLevel(),
Logger.Message(stringLiteral: message),
metadata: mappedDict,
source: source,
file: file,
function: function,
line: line)
}

func info(_ message: String) {
info(Message(stringLiteral: message))
}

func debug(_ message: String) {
debug(Message(stringLiteral: message))
}

func warn(_ message: String) {
warning(Message(stringLiteral: message))
}

func error(_ message: String) {
error(Message(stringLiteral: message))
}

func trace(_ message: String) {
trace(Message(stringLiteral: message))
}

func fatal(_ message: String) {
critical(Message(stringLiteral: message))
}

extension LogAgentLevel {
func toLoggerLevel() -> Logger.Level {
switch self {
case .trace:
return .trace
case .debug:
return .debug
case .info:
return .info
case .warn:
return .warning
case .error:
return .error
case .fatal:
return .critical
}
}
}

0 comments on commit 567abc3

Please sign in to comment.