Skip to content

Commit d3c2086

Browse files
Merge pull request #41 from GoodRequest/feature/remove-logger
Refactor Logging System and Enhance Session Configuration
2 parents faf65d1 + 41bbeac commit d3c2086

File tree

18 files changed

+173
-161
lines changed

18 files changed

+173
-161
lines changed

GoodNetworking-Sample/GoodNetworking-Sample.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
09A9ECA12C48115A0032C359 /* GoodSwiftUI in Frameworks */ = {isa = PBXBuildFile; productRef = 09A9ECA02C48115A0032C359 /* GoodSwiftUI */; };
1818
09A9ECA32C4811B00032C359 /* UserListScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A9ECA22C4811B00032C359 /* UserListScreen.swift */; };
1919
09A9ECAE2C4AC9810032C359 /* JobUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A9ECAD2C4AC9810032C359 /* JobUser.swift */; };
20+
3F8799A12DF703B000B4286B /* SampleLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8799A02DF703B000B4286B /* SampleLogger.swift */; };
2021
5D4200142CBEE7ED006C4292 /* UserDefaultsExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4200132CBEE7ED006C4292 /* UserDefaultsExtensions.swift */; };
2122
5D4200192CBF97CC006C4292 /* ServerPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4200182CBF97CC006C4292 /* ServerPickerView.swift */; };
2223
5D4A967C299C190B00DFAEAE /* GoodNetworking in Frameworks */ = {isa = PBXBuildFile; productRef = 5D4A967B299C190B00DFAEAE /* GoodNetworking */; };
@@ -35,6 +36,7 @@
3536
09A9EC992C48015C0032C359 /* SampleEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleEndpoint.swift; sourceTree = "<group>"; };
3637
09A9ECA22C4811B00032C359 /* UserListScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserListScreen.swift; sourceTree = "<group>"; };
3738
09A9ECAD2C4AC9810032C359 /* JobUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JobUser.swift; sourceTree = "<group>"; };
39+
3F8799A02DF703B000B4286B /* SampleLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleLogger.swift; sourceTree = "<group>"; };
3840
5D4200132CBEE7ED006C4292 /* UserDefaultsExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsExtensions.swift; sourceTree = "<group>"; };
3941
5D4200182CBF97CC006C4292 /* ServerPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerPickerView.swift; sourceTree = "<group>"; };
4042
5D4A967A299C18FB00DFAEAE /* GoodNetworking */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = GoodNetworking; path = ..; sourceTree = "<group>"; };
@@ -92,6 +94,7 @@
9294
09A9EC942C4800B90032C359 /* SampleNetworkSessions.swift */,
9395
09A9EC992C48015C0032C359 /* SampleEndpoint.swift */,
9496
5D7C80642CA2CDB900116E10 /* SampleSelectableBaseUrlProvider.swift */,
97+
3F8799A02DF703B000B4286B /* SampleLogger.swift */,
9598
);
9699
path = Managers;
97100
sourceTree = "<group>";
@@ -250,6 +253,7 @@
250253
buildActionMask = 2147483647;
251254
files = (
252255
09A9ECA32C4811B00032C359 /* UserListScreen.swift in Sources */,
256+
3F8799A12DF703B000B4286B /* SampleLogger.swift in Sources */,
253257
09A9EC9A2C48015C0032C359 /* SampleEndpoint.swift in Sources */,
254258
09A9EC8F2C47FF8E0032C359 /* UserScreen.swift in Sources */,
255259
EACEC3FA29953DCB008242AA /* AppDelegate.swift in Sources */,

GoodNetworking-Sample/GoodNetworking-Sample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 1 addition & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// SampleLogger.swift
3+
// GoodNetworking-Sample
4+
//
5+
// Created by Matus Klasovity on 09/06/2025.
6+
//
7+
8+
import Foundation
9+
import GoodNetworking
10+
11+
struct SampleLogger: NetworkLogger {
12+
13+
func logNetworkEvent(message: Any, level: LogLevel, fileName: String, lineNumber: Int) {
14+
switch level {
15+
case .debug:
16+
print("[DEBUG] \(fileName):\(lineNumber) - \(message)")
17+
case .info:
18+
print("[INFO] \(fileName):\(lineNumber) - \(message)")
19+
case .warning:
20+
print("[WARNING] \(fileName):\(lineNumber) - \(message)")
21+
case .error:
22+
print("[ERROR] \(fileName):\(lineNumber) - \(message)")
23+
}
24+
}
25+
26+
}

GoodNetworking-Sample/GoodNetworking-Sample/Managers/SampleNetworkSessions.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ extension NetworkSession {
3535
let urlProvider = CustomBaseUrlProvider(serverCollection: prodServerCollection)
3636
#endif
3737
baseURLProvider = urlProvider
38-
NetworkSession.sampleSession = NetworkSession(baseUrl: urlProvider)
38+
NetworkSession.sampleSession = NetworkSession(
39+
baseUrl: urlProvider,
40+
configuration: .default(logger: SampleLogger()),
41+
logger: SampleLogger()
42+
)
3943
}
4044

4145
}

GoodNetworking-Sample/GoodNetworking-Sample/Screens/UserListScreen.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ struct UserListScreen: View {
1313

1414
// MARK: - State
1515

16-
@State private var users = Resource(session: .sampleSession, remote: RemoteUser.self)
16+
@State private var users = Resource(
17+
session: .sampleSession,
18+
remote: RemoteUser.self,
19+
logger: SampleLogger()
20+
)
1721
@State private var didLoadList = false
1822
@State private var presentServerSettings = false
1923

Package.resolved

Lines changed: 1 addition & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ let package = Package(
2424
.package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.10.0")),
2525
.package(url: "https://github.com/Alamofire/AlamofireImage.git", .upToNextMajor(from: "4.2.0")),
2626
.package(url: "https://github.com/KittyMac/Sextant.git", .upToNextMinor(from: "0.4.31")),
27-
.package(url: "https://github.com/GoodRequest/GoodLogger.git", .upToNextMajor(from: "1.2.4"))
2827
],
2928
targets: [
3029
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
@@ -35,7 +34,6 @@ let package = Package(
3534
.product(name: "Alamofire", package: "Alamofire"),
3635
.product(name: "AlamofireImage", package: "AlamofireImage"),
3736
.product(name: "Sextant", package: "Sextant"),
38-
.product(name: "GoodLogger", package: "GoodLogger")
3937
],
4038
path: "./Sources/GoodNetworking",
4139
resources: [.copy("PrivacyInfo.xcprivacy")],

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,5 +278,31 @@ struct RemoteUser: Readable {
278278
```
279279
And voila, all is setup. You can update the user directly with a state variable. The library also support all the CRUD operations with protocols `Creatable`, `Readable`, `Updatable`, `Deletable` and also more like `Listable` for pagination of lists.
280280

281+
## Logging
282+
```swift
283+
struct SampleLogger: NetworkLogger {
284+
285+
func logNetworkEvent(message: Any, level: LogLevel, fileName: String, lineNumber: Int) {
286+
switch level {
287+
case .debug:
288+
print("[DEBUG] \(fileName):\(lineNumber) - \(message)")
289+
case .info:
290+
print("[INFO] \(fileName):\(lineNumber) - \(message)")
291+
case .warning:
292+
print("[WARNING] \(fileName):\(lineNumber) - \(message)")
293+
case .error:
294+
print("[ERROR] \(fileName):\(lineNumber) - \(message)")
295+
}
296+
}
297+
298+
}
299+
300+
NetworkSession.sampleSession = NetworkSession(
301+
baseUrl: urlProvider,
302+
configuration: .default(logger: SampleLogger()),
303+
logger: SampleLogger()
304+
)
305+
```
306+
281307
## License
282308
GoodNetworking is released under the MIT license. See [LICENSE](LICENSE.md) for details.

Sources/GoodNetworking/Executor/DeduplicatingRequestExecutor.swift

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import Alamofire
99
import Foundation
10-
import GoodLogger
1110

1211
/// A request executor that deduplicates concurrent requests and provides caching capabilities.
1312
///
@@ -37,27 +36,17 @@ public final actor DeduplicatingRequestExecutor: RequestExecuting, Sendable, Ide
3736
/// A dictionary storing currently running or cached request tasks
3837
public static var runningRequestTasks: [String: ExecutorTask] = [:]
3938

40-
/// A private property that provides the appropriate logger based on the iOS version.
41-
///
42-
/// For iOS 14 and later, it uses `OSLogLogger`. For earlier versions, it defaults to `PrintLogger`.
43-
private var logger: GoodLogger
39+
/// A private property that provides the logger.
40+
private var logger: NetworkLogger?
4441

4542
/// Creates a new deduplicating request executor.
4643
///
4744
/// - Parameters:
4845
/// - taskId: A unique identifier for deduplicating requests
4946
/// - cacheTimeout: The duration in seconds for which successful responses are cached. Defaults to 6 seconds.
5047
/// Set to 0 to disable caching.
51-
public init(taskId: String? = nil, cacheTimeout: TimeInterval = 6, logger: GoodLogger? = nil) {
52-
if let logger {
53-
self.logger = logger
54-
} else {
55-
if #available(iOS 14, *) {
56-
self.logger = OSLogLogger(logMetaData: false)
57-
} else {
58-
self.logger = PrintLogger(logMetaData: false)
59-
}
60-
}
48+
public init(taskId: String? = nil, cacheTimeout: TimeInterval = 6, logger: NetworkLogger? = nil) {
49+
self.logger = logger
6150
self.taskId = taskId
6251
self.cacheTimeout = cacheTimeout
6352
}
@@ -97,7 +86,7 @@ public final actor DeduplicatingRequestExecutor: RequestExecuting, Sendable, Ide
9786
}
9887

9988
if let runningTask = DeduplicatingRequestExecutor.runningRequestTasks[taskId] {
100-
logger.log(message: "🚀 taskId: \(taskId) Cached value used", level: .info)
89+
logger?.logNetworkEvent(message: "🚀 taskId: \(taskId) Cached value used", level: .info, fileName: #file, lineNumber: #line)
10190
return await runningTask.task.value
10291
} else {
10392
let requestTask = ExecutorTask.TaskType {
@@ -116,7 +105,7 @@ public final actor DeduplicatingRequestExecutor: RequestExecuting, Sendable, Ide
116105
}
117106
}
118107

119-
logger.log(message: "🚀 taskId: \(taskId): Task created", level: .info)
108+
logger?.logNetworkEvent(message: "🚀 taskId: \(taskId): Task created", level: .info, fileName: #file, lineNumber: #line)
120109

121110
let executorTask: ExecutorTask = ExecutorTask(
122111
taskId: taskId,
@@ -129,7 +118,7 @@ public final actor DeduplicatingRequestExecutor: RequestExecuting, Sendable, Ide
129118
let dataResponse = await requestTask.value
130119
switch dataResponse.result {
131120
case .success:
132-
logger.log(message: "🚀 taskId: \(taskId): Task finished successfully", level: .info)
121+
logger?.logNetworkEvent(message: "🚀 taskId: \(taskId): Task finished successfully", level: .info, fileName: #file, lineNumber: #line)
133122

134123
if cacheTimeout > 0 {
135124
DeduplicatingRequestExecutor.runningRequestTasks[taskId]?.finishDate = Date()
@@ -140,7 +129,7 @@ public final actor DeduplicatingRequestExecutor: RequestExecuting, Sendable, Ide
140129
return dataResponse
141130

142131
case .failure:
143-
logger.log(message: "🚀 taskId: \(taskId): Task finished with error", level: .error)
132+
logger?.logNetworkEvent(message: "🚀 taskId: \(taskId): Task finished with error", level: .error, fileName: #file, lineNumber: #line)
144133
DeduplicatingRequestExecutor.runningRequestTasks[taskId] = nil
145134
return dataResponse
146135
}

Sources/GoodNetworking/Executor/RequestExecuting.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import Alamofire
99
import Foundation
10-
import GoodLogger
1110

1211
/// A protocol defining the interface for executing network requests.
1312
///

0 commit comments

Comments
 (0)