Skip to content

Commit

Permalink
staticに修正
Browse files Browse the repository at this point in the history
  • Loading branch information
akidon0000 committed Feb 16, 2024
1 parent e73901c commit 7f7b235
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 55 deletions.
75 changes: 21 additions & 54 deletions Sources/Logging/Logging.swift
Original file line number Diff line number Diff line change
@@ -1,36 +1,30 @@
import Foundation

protocol AKLoggerProtocol {
func trace<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func debug<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func info<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func notice<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func warn<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func error<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
func critical<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
static func trace<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
static func debug<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
static func info<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
static func notice<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
static func warn<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
static func error<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
static func critical<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
}

public struct AKLog: AKLoggerProtocol {

internal var logHandler: (String) -> Void = { message in
static var logHandler: (String) -> Void = { message in
print(message)
}

internal var dateFormatter: (Date) -> String = { date in
static var dateFormatter: (Date) -> String = { date in
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
return formatter.string(from: date)
}

// MEMO: 現在はLogLevelのIntは使用していないが、後にレベルごとに出力内容を変える可能性がある。
private enum LogLevel: Int {
case trace = 100
case debug = 200
case info = 300
case notice = 400
case warn = 500
case error = 600
case critical = 700
case trace = 100, debug = 200, info = 300, notice = 400, warn = 500, error = 600, critical = 700

func stringValue() -> String {
switch self {
Expand All @@ -45,68 +39,41 @@ public struct AKLog: AKLoggerProtocol {
}
}

private func log<T>(_ message: @autoclosure () -> T,
level: LogLevel, filename: String, line: Int, function: String) {
private static func log<T>(_ message: @autoclosure () -> T, level: LogLevel, filename: String, line: Int, function: String) {
let date = dateFormatter(Date())
let levelStr = level.stringValue()
let cleanedfile = cleanedFilename(filename)
let msg = message()
// フルパス+ファイル名から、ファイル名のみを抽出
let cleanedFilename = filename.components(separatedBy: "/").last ?? filename

let logMessage = "\(date) [\(levelStr)] \(cleanedfile):\(line) - \(function):\(msg)"
let logMessage = "\(date) [\(levelStr)] \(cleanedFilename):\(line) - \(function):\(message())"
logHandler(logMessage)
}

private var cleanedFilenamesCache: NSCache<AnyObject, AnyObject> = NSCache()
// 「フルパス+ファイル名」から「ファイル名」のみに抽出
private func cleanedFilename(_ filename: String) -> String {
if let cleanedfile: String = cleanedFilenamesCache.object(forKey: filename as AnyObject) as? String {
return cleanedfile
} else {
var retval = ""
let items = filename.split { $0 == "/" }.map(String.init)

if items.count > 0 {
retval = items.last!
}
cleanedFilenamesCache.setObject(retval as AnyObject, forKey: filename as AnyObject)
return retval
}
}
}

extension AKLog {
public func trace<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
public static func trace<T>(_ message: @autoclosure () -> T, filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .trace, filename: filename, line: line, function: function)
}

public func debug<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
public static func debug<T>(_ message: @autoclosure () -> T, filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .debug, filename: filename, line: line, function: function)
}

public func info<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
public static func info<T>(_ message: @autoclosure () -> T, filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .info, filename: filename, line: line, function: function)
}

public func notice<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
public static func notice<T>(_ message: @autoclosure () -> T, filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .notice, filename: filename, line: line, function: function)
}

public func warn<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
public static func warn<T>(_ message: @autoclosure () -> T, filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .warn, filename: filename, line: line, function: function)
}

public func error<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
public static func error<T>(_ message: @autoclosure () -> T, filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .error, filename: filename, line: line, function: function)
}

public func critical<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
public static func critical<T>(_ message: @autoclosure () -> T, filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .critical, filename: filename, line: line, function: function)
}
}
2 changes: 1 addition & 1 deletion Tests/LoggingTests/LoggingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ final class AKLogTests: XCTestCase {

func testLogOutput() {
var loggedMessages: [String] = []
var logger = AKLog()
let logger = AKLog.self
logger.logHandler = { message in
loggedMessages.append(message)
}
Expand Down

0 comments on commit 7f7b235

Please sign in to comment.