Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
0522C1D72DB67B4F00B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1D62DB67B4F00B141FF /* RxSwift */; };
05EC93D92DB6605100771CB3 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC93D82DB6605100771CB3 /* RxCocoa */; };
05EC93DE2DB6612100771CB3 /* RxGesture in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC93DD2DB6612100771CB3 /* RxGesture */; };
4EBC91D32DB8039800495C3B /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EBC91D22DB8039800495C3B /* OSLog.framework */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
Expand All @@ -27,6 +28,7 @@

/* Begin PBXFileReference section */
058CC9182DB5383C0084221A /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4EBC91D22DB8039800495C3B /* OSLog.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OSLog.framework; path = System/Library/Frameworks/OSLog.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedRootGroup section */
Expand All @@ -42,6 +44,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4EBC91D32DB8039800495C3B /* OSLog.framework in Frameworks */,
0522C1D72DB67B4F00B141FF /* RxSwift in Frameworks */,
05EC93DE2DB6612100771CB3 /* RxGesture in Frameworks */,
05EC93D92DB6605100771CB3 /* RxCocoa in Frameworks */,
Expand All @@ -54,6 +57,7 @@
05125B6A2DB56C32001342A2 /* Frameworks */ = {
isa = PBXGroup;
children = (
4EBC91D22DB8039800495C3B /* OSLog.framework */,
);
name = Frameworks;
sourceTree = "<group>";
Expand Down
78 changes: 58 additions & 20 deletions Poppool/CoreLayer/Infrastructure/Infrastructure/Logger/Logger.swift
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import Foundation
import OSLog

public struct Logger {
public enum Level {
private static let subsystem = Bundle.main.bundleIdentifier ?? "com.poppoolIOS.poppool"

public enum Level: Hashable {
case info
case debug
case network
case error
case event
case custom(categoryName: String)
case custom(name: String)

var categoryName: String {
switch self {
Expand All @@ -21,8 +24,7 @@ public struct Logger {
return "Error"
case .event:
return "Event"
case .custom(let categoryName):
return categoryName
case .custom(let name): return name
}
}

Expand All @@ -44,26 +46,62 @@ public struct Logger {
}
}

static var isShowFileName: Bool = false
static var isShowLine: Bool = false
static var isShowLog: Bool = true
public enum LogLevel {
case debug
case info
case error
case fault

var osLogType: OSLogType {
switch self {
case .debug:
return .debug
case .info:
return .info
case .error: return .error
case .fault: return .fault
}
}
}

private static var isShowFileName: Bool = false
private static var isShowLine: Bool = true
private static var isShowLog: Bool = true

private static var loggers: [Level: os.Logger] = [:]
private static func getLogger(for category: Level) -> os.Logger {
let categoryName = category.categoryName

if let cachedLogger = loggers[category] {
return cachedLogger
}

let logger = os.Logger(subsystem: subsystem, category: categoryName)
loggers[category] = logger
return logger
}

public static func log(
message: Any,
_ message: Any,
category: Level,
fileName: String = "Input is not found",
line: Int? = nil
level: LogLevel = .info,
file: String = #file,
line: Int = #line
) {
if isShowLog {
print("\(category.categoryIcon) [\(category.categoryName)]: \(message)")
if isShowFileName {
guard let fileName = fileName.components(separatedBy: "/").last else { return }
print(" \(category.categoryIcon) [FileName]: \(fileName)")
}
if isShowLine {
guard let line = line else { return }
print(" \(category.categoryIcon) [Line]: \(line)")
}
guard isShowLog else { return }

let logger = getLogger(for: category)
var fullMessage = "\(category.categoryIcon) \(message)"

if isShowFileName {
let fileNameOnly = (file as NSString).lastPathComponent
fullMessage += " | 📁 \(fileNameOnly)"
}

if isShowLine {
fullMessage += " | 📍 \(line)"
}

logger.log(level: level.osLogType, "\(fullMessage, privacy: .public)")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,8 @@ public final class KeyChainService {
if let data = dataTypeRef as? Data {
if let value = String(data: data, encoding: .utf8) {
Logger.log(
message: "Successfully fetched \(type.rawValue) from KeyChain: \(value)",
category: .info,
fileName: #file,
line: #line
"Successfully fetched \(type.rawValue) from KeyChain",
category: .info
)
return .success(value)
} else {
Expand Down Expand Up @@ -84,10 +82,9 @@ public final class KeyChainService {
let status = SecItemAdd(keyChainQuery, nil)
if status == errSecSuccess {
Logger.log(
message: "Successfully saved \(type.rawValue) to KeyChain: \(value)",
category: .info,
fileName: #file,
line: #line
"Successfully fetched \(type.rawValue) from KeyChain: \(value)",
category: .info

)
return .success(())
} else {
Expand All @@ -111,10 +108,8 @@ public final class KeyChainService {

if status == errSecSuccess {
Logger.log(
message: "Successfully deleted \(type.rawValue) from KeyChain",
category: .info,
fileName: #file,
line: #line
"Successfully deleted \(type.rawValue) from KeyChain",
category: .info
)
return .success(())
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Infrastructure

struct PreSignedAPIEndPoint {
static func presigned_upload(request: PresignedURLRequestDTO) -> Endpoint<PreSignedURLResponseDTO> {
Logger.log(message: "Presigned URL 생성 - Request: \(request)", category: .debug)
Logger.log("Presigned URL 생성 - Request: \(request)", category: .debug)
return Endpoint(
baseURL: Secrets.popPoolBaseURL,
path: "/files/upload-preSignedUrl",
Expand All @@ -14,7 +14,7 @@ struct PreSignedAPIEndPoint {
}

static func presigned_download(request: PresignedURLRequestDTO) -> Endpoint<PreSignedURLResponseDTO> {
Logger.log(message: "Presigned Download URL 생성 - Request: \(request)", category: .debug)
Logger.log("Presigned Download URL 생성 - Request: \(request)", category: .debug)
return Endpoint(
baseURL: Secrets.popPoolBaseURL,
path: "/files/download-preSignedUrl",
Expand All @@ -24,7 +24,7 @@ struct PreSignedAPIEndPoint {
}

static func presigned_delete(request: PresignedURLRequestDTO) -> RequestEndpoint {
Logger.log(message: "Presigned Delete 생성 - Request: \(request)", category: .debug)
Logger.log("Presigned Delete 생성 - Request: \(request)", category: .debug)
return RequestEndpoint(
baseURL: Secrets.popPoolBaseURL,
path: "/files/delete",
Expand Down
6 changes: 2 additions & 4 deletions Poppool/DataLayer/Data/Data/Network/Common/Requestable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ extension Requestable {
let url = try url()

Logger.log(
message: "\(url) URL 생성",
category: .network,
fileName: #file,
line: #line
"\(url) URL 생성",
category: .network
)

var urlRequest = URLRequest(url: url)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class MultipartEndPoint: URLRequestConvertible {
public func asURLRequest() throws -> URLRequest {
let url = try baseURL.asURL().appendingPathComponent(path)
var request = URLRequest(url: url)
Logger.log(message: "\(request) URL 생성", category: .network)
Logger.log("\(request) URL 생성", category: .network)
request.method = method

if let headers = headers {
Expand All @@ -57,7 +57,7 @@ public class MultipartEndPoint: URLRequestConvertible {
multipartFormData.append(jsonString.data(using: .utf8)!, withName: "data")
}
} catch {
Logger.log(message: "JSON 변환 오류: \(error)", category: .network)
Logger.log("JSON 변환 오류: \(error)", category: .network)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ final class TokenInterceptor: RequestInterceptor {
_ urlRequest: URLRequest,
for session: Session,
completion: @escaping (Result<URLRequest, any Error>) -> Void) {
Logger.log(message: "TokenInterceptor Adapt Token", category: .network)
Logger.log("TokenInterceptor Adapt Token", category: .network)
@Dependency var keyChainService: KeyChainService
var urlRequest = urlRequest
let accessTokenResult = keyChainService.fetchToken(type: .accessToken)
Expand All @@ -32,7 +32,7 @@ final class TokenInterceptor: RequestInterceptor {
dueTo error: any Error,
completion: @escaping (RetryResult) -> Void
) {
Logger.log(message: "TokenInterceptor Retry Start", category: .network)
Logger.log("TokenInterceptor Retry Start", category: .network)
completion(.doNotRetry)
}
}
56 changes: 9 additions & 47 deletions Poppool/DataLayer/Data/Data/Network/Provider/ProviderImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,11 @@ public final class ProviderImpl: Provider {
/// 1) endpoint -> urlRequest 생성
let urlRequest = try endpoint.getUrlRequest()

Logger.log(
message: """
[Provider] 최종 요청 URL:
- URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- Method: \(urlRequest.httpMethod ?? "알 수 없음")
- Headers: \(urlRequest.allHTTPHeaderFields ?? [:])
요청 시각: \(Date())
""",
category: .debug
)

let request = AF.request(urlRequest, interceptor: interceptor)
.validate()
.responseData { [weak self] response in
Logger.log(
message: """
"""
[Provider] 응답 수신:
- URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- 응답 시각: \(Date())
Expand All @@ -63,14 +52,14 @@ public final class ProviderImpl: Provider {
observer.onCompleted()
} catch {
Logger.log(
message: "디코딩 실패: \(error.localizedDescription)",
"디코딩 실패: \(error.localizedDescription)",
category: .error
)
observer.onError(NetworkError.decodeError)
}

case .failure(let error):
Logger.log(message: "요청 실패 Error:\(error)", category: .error)
Logger.log("요청 실패 Error:\(error)", category: .error)
observer.onError(error)
}
}
Expand All @@ -80,7 +69,7 @@ public final class ProviderImpl: Provider {
}

} catch {
Logger.log(message: "[Provider] URLRequest 생성 실패: \(error.localizedDescription)", category: .error)
Logger.log("[Provider] URLRequest 생성 실패: \(error.localizedDescription)", category: .error)
observer.onError(NetworkError.urlRequest(error))
return Disposables.create()
}
Expand All @@ -101,19 +90,9 @@ public final class ProviderImpl: Provider {
do {
let urlRequest = try request.getUrlRequest()

Logger.log(
message: """
[Provider] 최종 요청 URL(Completable):
- URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- Method: \(urlRequest.httpMethod ?? "알 수 없음")
요청 시각: \(Date())
""",
category: .debug
)

self.executeRequest(urlRequest, interceptor: interceptor) { response in
Logger.log(
message: "응답 시각 :\(Date())",
"응답 시각 :\(Date())",
category: .network
)

Expand All @@ -132,12 +111,12 @@ public final class ProviderImpl: Provider {
case .success:
observer(.completed)
case .failure(let error):
Logger.log(message: "요청 실패 Error:\(error)", category: .error)
Logger.log("요청 실패 Error:\(error)", category: .error)
observer(.error(self.handleRequestError(response: response, error: error)))
}
}
} catch {
Logger.log(message: "[Provider] URLRequest 생성 실패 (Completable): \(error.localizedDescription)", category: .error)
Logger.log("[Provider] URLRequest 생성 실패 (Completable): \(error.localizedDescription)", category: .error)
observer(.error(NetworkError.urlRequest(error)))
}

Expand All @@ -158,23 +137,15 @@ public final class ProviderImpl: Provider {

do {
let urlRequest = try request.asURLRequest()
Logger.log(
message: """
[Provider] 이미지 업로드 요청:
- URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
- Method: \(urlRequest.httpMethod ?? "알 수 없음")
""",
category: .network
)

AF.upload(multipartFormData: { multipartFormData in
request.asMultipartFormData(multipartFormData: multipartFormData)
Logger.log(message: "업로드 시각 :\(Date())", category: .network)
Logger.log("업로드 시각 :\(Date())", category: .network)
}, with: urlRequest, interceptor: interceptor)
.validate()
.response { response in
Logger.log(
message: "이미지 업로드 응답 시각 :\(Date())",
"이미지 업로드 응답 시각 :\(Date())",
category: .network
)
switch response.result {
Expand All @@ -200,15 +171,6 @@ private extension ProviderImpl {
interceptor: RequestInterceptor?,
completion: @escaping (AFDataResponse<Data?>) -> Void
) {
// 여기서도 최종 URL 찍을 수 있음
Logger.log(
message: """
[Provider] executeRequest:
- URL: \(urlRequest.url?.absoluteString ?? "URL이 없습니다.")
요청 시각: \(Date())
""",
category: .debug
)

AF.request(urlRequest, interceptor: interceptor)
.validate()
Expand Down
Loading