Skip to content

Commit aa94b38

Browse files
committed
version 0.1.0
1 parent 2992f00 commit aa94b38

File tree

8 files changed

+339
-28
lines changed

8 files changed

+339
-28
lines changed

Package.resolved

+9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
"revision": "173f567a2dfec11d74588eea82cecea555bdc0bc",
1010
"version": "1.4.0"
1111
}
12+
},
13+
{
14+
"package": "XCGLogger",
15+
"repositoryURL": "https://github.com/DaveWoodCom/XCGLogger.git",
16+
"state": {
17+
"branch": null,
18+
"revision": "a9c4667b247928a29bdd41be2ec2c8d304215a54",
19+
"version": "7.0.1"
20+
}
1221
}
1322
]
1423
},

Package.swift

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,20 @@ let package = Package(
1212
],
1313
dependencies: [
1414
.package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"),
15+
.package(url: "https://github.com/DaveWoodCom/XCGLogger.git", from: "7.0.0")
1516
],
1617
targets: [
1718
.target(
1819
name: "FileLogging",
1920
dependencies: [
21+
"XCGLogger",
2022
.product(name: "Logging", package: "swift-log")
2123
]),
2224
.testTarget(
2325
name: "swift-log-fileTests",
24-
dependencies: ["FileLogging"]),
26+
dependencies: [
27+
"FileLogging",
28+
"XCGLogger"
29+
]),
2530
]
2631
)

README.md

+29
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,33 @@ let logger = Logger(label: "Test")
3030

3131
Note in that last example, if you use `LoggingSystem.bootstrap`, make sure to create your `Logger` *after* the `LoggingSystem.bootstrap` usage (or you won't get the effects of the `LoggingSystem.bootstrap`).
3232

33+
## Example: Using XCGLogger
34+
35+
[XCGLogger](https://github.com/DaveWoodCom/XCGLogger.git) supports rotating file logs amongst other features.
36+
37+
```swift
38+
let logFileURL = URL(/* your local log file here */)
39+
let xcgLogger = /* Make your XCGLogger, using logFileURL */
40+
let logger = XCGLogging.logger(label: "Test", logger: xcgLogger)
41+
logger.error("Test Test Test")
42+
```
43+
44+
## Example: Logging to both the standard output (Xcode console if using Xcode) and a file using XCGLogger.
45+
46+
```swift
47+
let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName)
48+
let xcgLogger = /* Make your XCGLogger, using logFileURL */
49+
50+
LoggingSystem.bootstrap { label in
51+
let handlers:[LogHandler] = [
52+
XCGLoggerHandler(label: label, logger: xcgLogger),
53+
StreamLogHandler.standardOutput(label: label)
54+
]
55+
56+
return MultiplexLogHandler(handlers)
57+
}
58+
59+
let logger = Logger(label: "Test")
60+
```
61+
3362
For more examples, see the unit tests and refer to [apple/swift-log's README](https://github.com/apple/swift-log#the-core-concepts)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
2+
import Logging
3+
import Foundation
4+
import XCGLogger
5+
6+
public struct XCGLogging {
7+
let logger:XCGLogger
8+
9+
public init(logger:XCGLogger) {
10+
self.logger = logger
11+
}
12+
13+
public func handler(label: String) -> XCGLoggerHandler {
14+
return XCGLoggerHandler(label: label, logger: logger)
15+
}
16+
17+
public static func logger(label: String, logger:XCGLogger) -> Logger {
18+
let logging = XCGLogging(logger: logger)
19+
return Logger(label: label, factory: logging.handler)
20+
}
21+
}
22+
23+
/// `XCGLoggerHandler` is an implementation of `LogHandler` that makes use of the XCGLogger.
24+
public struct XCGLoggerHandler: LogHandler {
25+
private var xcgLogger:XCGLogger
26+
private var label: String
27+
28+
public var logLevel: Logger.Level = .info
29+
30+
public var metadata = Logger.Metadata()
31+
32+
public subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? {
33+
get {
34+
return self.metadata[metadataKey]
35+
}
36+
set {
37+
self.metadata[metadataKey] = newValue
38+
}
39+
}
40+
41+
public init(label: String, logger:XCGLogger) {
42+
self.label = label
43+
self.xcgLogger = logger
44+
}
45+
46+
public func log(level: Logger.Level,
47+
message: Logger.Message,
48+
metadata: Logger.Metadata?,
49+
source: String,
50+
file: String = #file,
51+
function: String = #function,
52+
line: UInt = #line) {
53+
54+
let xcgLoggerLevel = convert(level: level)
55+
xcgLogger.logln(xcgLoggerLevel, functionName: function, fileName: file, lineNumber: Int(line), userInfo: metadata ?? self.metadata) {
56+
return message
57+
}
58+
}
59+
60+
func convert(level: Logger.Level) -> XCGLogger.Level {
61+
switch level {
62+
case .trace:
63+
return .verbose
64+
65+
case .debug:
66+
return .debug
67+
68+
case .info:
69+
return .info
70+
71+
case .notice:
72+
return .notice
73+
74+
case .warning:
75+
return .warning
76+
77+
case .error:
78+
return .error
79+
80+
case .critical:
81+
return .severe
82+
}
83+
}
84+
}
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
import Foundation
3+
4+
enum TestError: Error {
5+
case noDocumentDirectory
6+
case cannotGetFileSize
7+
}
8+
9+
protocol Utilities {
10+
}
11+
12+
extension Utilities {
13+
func getDocumentsDirectory() throws -> URL {
14+
let paths = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask)
15+
guard paths.count > 0 else {
16+
throw TestError.noDocumentDirectory
17+
}
18+
19+
return paths[0]
20+
}
21+
22+
func getFileSize(file: URL) throws -> UInt64 {
23+
let attr = try FileManager.default.attributesOfItem(atPath: file.path)
24+
guard let fileSize = attr[FileAttributeKey.size] as? UInt64 else {
25+
throw TestError.cannotGetFileSize
26+
}
27+
28+
return fileSize
29+
}
30+
}

Tests/swift-log-fileTests/swift_log_fileTests.swift

+8-26
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@ import XCTest
22
@testable import FileLogging
33
@testable import Logging
44

5-
enum TestError: Error {
6-
case noDocumentDirectory
7-
case cannotGetFileSize
8-
}
9-
10-
final class swift_log_fileTests: XCTestCase {
5+
final class swift_log_fileTests: XCTestCase, Utilities {
116
let logFileName = "LogFile.txt"
127

138
func testLogToFileUsingBootstrap() throws {
@@ -21,6 +16,8 @@ final class swift_log_fileTests: XCTestCase {
2116

2217
// Not really an error.
2318
logger.error("Test Test Test")
19+
20+
try? FileManager.default.removeItem(at: logFileURL)
2421
}
2522

2623
func testLogToFileAppendsAcrossLoggerCalls() throws {
@@ -39,6 +36,7 @@ final class swift_log_fileTests: XCTestCase {
3936
let fileSize2 = try getFileSize(file: logFileURL)
4037

4138
XCTAssert(fileSize2 > fileSize1)
39+
try? FileManager.default.removeItem(at: logFileURL)
4240
}
4341

4442
func testLogToFileAppendsAcrossConstructorCalls() throws {
@@ -55,6 +53,7 @@ final class swift_log_fileTests: XCTestCase {
5553
let fileSize2 = try getFileSize(file: logFileURL)
5654

5755
XCTAssert(fileSize2 > fileSize1)
56+
try? FileManager.default.removeItem(at: logFileURL)
5857
}
5958

6059
// Adapted from https://nshipster.com/swift-log/
@@ -75,6 +74,7 @@ final class swift_log_fileTests: XCTestCase {
7574

7675
// TODO: Manually check that the output also shows up in the Xcode console.
7776
logger.error("Test Test Test")
77+
try? FileManager.default.removeItem(at: logFileURL)
7878
}
7979

8080
func testLoggingUsingLoggerFactoryConstructor() throws {
@@ -90,6 +90,7 @@ final class swift_log_fileTests: XCTestCase {
9090
let fileSize2 = try getFileSize(file: logFileURL)
9191

9292
XCTAssert(fileSize2 > fileSize1)
93+
try? FileManager.default.removeItem(at: logFileURL)
9394
}
9495

9596
func testLoggingUsingConvenienceMethod() throws {
@@ -104,25 +105,6 @@ final class swift_log_fileTests: XCTestCase {
104105
let fileSize2 = try getFileSize(file: logFileURL)
105106

106107
XCTAssert(fileSize2 > fileSize1)
107-
}
108-
109-
// MARK: Helpers
110-
111-
func getDocumentsDirectory() throws -> URL {
112-
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
113-
guard paths.count > 0 else {
114-
throw TestError.noDocumentDirectory
115-
}
116-
117-
return paths[0]
118-
}
119-
120-
func getFileSize(file: URL) throws -> UInt64 {
121-
let attr = try FileManager.default.attributesOfItem(atPath: file.path)
122-
guard let fileSize = attr[FileAttributeKey.size] as? UInt64 else {
123-
throw TestError.noDocumentDirectory
124-
}
125-
126-
return fileSize
108+
try? FileManager.default.removeItem(at: logFileURL)
127109
}
128110
}

0 commit comments

Comments
 (0)