Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

staticに修正 #4

Merged
merged 1 commit into from
Feb 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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