Skip to content

Commit

Permalink
Logging 基本的機能実装
Browse files Browse the repository at this point in the history
  • Loading branch information
akidon0000 committed Feb 14, 2024
1 parent df8a8cf commit c00cf89
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 71 deletions.
59 changes: 0 additions & 59 deletions Sources/AKLogger/AKLogger.swift

This file was deleted.

110 changes: 110 additions & 0 deletions Sources/Logging/Logging.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
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 criti<T>(_ message: @autoclosure () -> T, filename: String, line: Int, function: String)
}

public struct AKLogger: AKLoggerProtocol {

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

private enum LogLevel: Int {
case trace = 100
case debug = 200
case info = 300
case notice = 400
case warn = 500
case error = 600
case criti = 700

func stringValue() -> String {
switch self {
case .trace: return "TRACE"
case .debug: return "DEBUG"
case .info: return "INFO"
case .notice: return "NOTICE"
case .warn: return "WARN"
case .error: return "ERROR"
case .criti: return "CRITI"
}
}
}

private func log<T>(_ message: @autoclosure () -> T,
level: LogLevel, filename: String, line: Int, function: String) {
let cleanedfile = cleanedFilename(filename)

let msg = message()
var logMessage = ""

logMessage = "\(dateFormatter.string(from: Date())) [\(level.stringValue())] \(cleanedfile):\(line) - \(msg)"
logHandler(logMessage)
}

private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
return formatter
}()

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 AKLogger {
public 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) {
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) {
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) {
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) {
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) {
log(message(), level: .error, filename: filename, line: line, function: function)
}

public func criti<T>(_ message: @autoclosure () -> T,
filename: String = #file, line: Int = #line, function: String = #function) {
log(message(), level: .criti, filename: filename, line: line, function: function)
}
}
12 changes: 0 additions & 12 deletions Tests/AKLoggerTests/AKLoggerTests.swift

This file was deleted.

36 changes: 36 additions & 0 deletions Tests/LoggingTests/LoggingTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import XCTest
@testable import AKLogger

final class AKLoggerTests: XCTestCase {
func testLogOutput() {
var loggedMessages: [String] = []
var logger = AKLogger()
logger.logHandler = { message in
loggedMessages.append(message)
}

logger.trace("traceメッセージ")
XCTAssertTrue(loggedMessages[0].contains("traceメッセージ"))

logger.debug("debugメッセージ")
XCTAssertTrue(loggedMessages[1].contains("debugメッセージ"))

logger.info("infoメッセージ")
XCTAssertTrue(loggedMessages[2].contains("infoメッセージ"))

logger.notice("noticeメッセージ")
XCTAssertTrue(loggedMessages[3].contains("noticeメッセージ"))

logger.warn("warnメッセージ")
XCTAssertTrue(loggedMessages[4].contains("warnメッセージ"))

logger.error("errorメッセージ")
XCTAssertTrue(loggedMessages[5].contains("errorメッセージ"))

logger.criti("critiメッセージ")
XCTAssertTrue(loggedMessages[6].contains("critiメッセージ"))

print(loggedMessages)

}
}

0 comments on commit c00cf89

Please sign in to comment.