7
7
8
8
import Foundation
9
9
10
- public enum Logger : Loggable {
10
+ public protocol Loggable {
11
+ static var logTag : String { get }
12
+ static var logConfig : LoggerKit . LoggerConfig { get set }
13
+ }
14
+
15
+ public struct LoggerKit {
11
16
12
- enum LogLevel {
13
-
14
- case verbose, info, debug, warning, error
17
+ enum LogLevel : Int {
18
+ case verbose = 0 , info, debug, warning, error
15
19
case `init`, `deinit`
16
20
17
21
fileprivate var prefix : String {
@@ -33,34 +37,150 @@ public enum Logger: Loggable {
33
37
let line : Int
34
38
35
39
var description : String {
36
- guard let file else { return " \( line) " }
40
+ guard let file = file else { return " \( line) " }
37
41
return " \( ( file as NSString ) . lastPathComponent) : \( line) "
38
42
}
39
43
}
40
44
41
- static func handleLog( level: LogLevel , message: Any ? ... , shouldLogContext: Bool , context: Context ) {
42
- var logComponents : [ String ] = [ ]
45
+ public struct LoggerConfig {
43
46
44
- if shouldLogContext {
45
- if level == . `init` || level == . deinit {
46
- logComponents. append ( " \t \t \t \( level. prefix) " )
47
- } else {
48
- logComponents. append ( level. prefix)
49
- }
47
+ let enable : Bool
48
+ let severity : LoggerKit . LogLevel
49
+
50
+ init ( enable: Bool , severity: LoggerKit . LogLevel = . info) {
51
+ self . enable = enable
52
+ self . severity = severity
53
+ }
54
+
55
+ func shouldLog( _ level: LoggerKit . LogLevel ) -> Bool {
56
+ return level. rawValue >= self . severity. rawValue
50
57
}
58
+ }
59
+ }
51
60
52
- logComponents. append ( " \( context. description) - " )
61
+ public extension Loggable {
62
+
63
+ static func info( _ message: Any ... , shouldLogContext: Bool = true , file: String = #file, line: Int = #line) {
64
+ let context = LoggerKit . Context ( file: file, line: line)
65
+ handleLog (
66
+ level: . info,
67
+ message: formatLogMessage ( message) ,
68
+ shouldLogContext: shouldLogContext,
69
+ context: context,
70
+ logTag: logTag,
71
+ logConfig: logConfig
72
+ )
73
+ }
74
+
75
+ static func verbose( _ message: Any ... , shouldLogContext: Bool = true , file: String = #file, line: Int = #line) {
76
+ let context = LoggerKit . Context ( file: file, line: line)
77
+ handleLog (
78
+ level: . verbose,
79
+ message: formatLogMessage ( message) ,
80
+ shouldLogContext: shouldLogContext,
81
+ context: context,
82
+ logTag: logTag,
83
+ logConfig: logConfig
84
+ )
85
+ }
86
+
87
+ static func debug( _ message: Any ... , shouldLogContext: Bool = true , file: String = #file, line: Int = #line) {
88
+ let context = LoggerKit . Context ( file: file, line: line)
89
+ handleLog (
90
+ level: . debug,
91
+ message: formatLogMessage ( message) ,
92
+ shouldLogContext: shouldLogContext,
93
+ context: context,
94
+ logTag: logTag,
95
+ logConfig: logConfig
96
+ )
97
+ }
98
+
99
+ static func warning( _ message: Any ... , shouldLogContext: Bool = true , file: String = #file, line: Int = #line) {
100
+ let context = LoggerKit . Context ( file: file, line: line)
101
+ handleLog (
102
+ level: . warning,
103
+ message: formatLogMessage ( message) ,
104
+ shouldLogContext: shouldLogContext,
105
+ context: context,
106
+ logTag: logTag,
107
+ logConfig: logConfig
108
+ )
109
+ }
110
+
111
+ static func error( _ message: Any ... , shouldLogContext: Bool = true , file: String = #file, line: Int = #line) {
112
+ let context = LoggerKit . Context ( file: file, line: line)
113
+ handleLog (
114
+ level: . error,
115
+ message: formatLogMessage ( message) ,
116
+ shouldLogContext: shouldLogContext,
117
+ context: context,
118
+ logTag: logTag,
119
+ logConfig: logConfig
120
+ )
121
+ }
122
+
123
+ static func initialize( _ message: Any ... , shouldLogContext: Bool = false , file: String = #file, line: Int = #line) {
124
+ let context = LoggerKit . Context ( file: file, line: line)
125
+ handleLog (
126
+ level: . `init`,
127
+ message: formatLogMessage ( message) ,
128
+ shouldLogContext: shouldLogContext,
129
+ context: context,
130
+ logTag: logTag,
131
+ logConfig: logConfig
132
+ )
133
+ }
134
+
135
+ static func teardown( _ message: Any ... , shouldLogContext: Bool = false , file: String = #file, line: Int = #line) {
136
+ let context = LoggerKit . Context ( file: file, line: line)
137
+ handleLog (
138
+ level: . deinit,
139
+ message: formatLogMessage ( message) ,
140
+ shouldLogContext: shouldLogContext,
141
+ context: context,
142
+ logTag: logTag,
143
+ logConfig: logConfig
144
+ )
145
+ }
146
+ }
147
+
148
+ extension Loggable {
149
+
150
+ private static func handleLog(
151
+ level: LoggerKit . LogLevel ,
152
+ message: String ,
153
+ shouldLogContext: Bool ,
154
+ context: LoggerKit . Context ,
155
+ logTag: String ,
156
+ logConfig: LoggerKit . LoggerConfig
157
+ ) {
158
+ guard logConfig. enable else { return }
159
+ guard logConfig. shouldLog ( level) else { return }
53
160
54
- message. forEach { message in
55
- if let message {
56
- logComponents. append ( String ( describing: message) )
57
- }
161
+ var logComponents : [ String ] = [ ]
162
+
163
+ let logFormat = " \( level. prefix) [ \( logTag) ] "
164
+
165
+ switch level {
166
+ case . `init`, . deinit:
167
+ logComponents. append ( " \t \t \t \( logFormat) : " )
168
+ default :
169
+ logComponents. append ( logFormat)
58
170
}
59
171
172
+ if shouldLogContext { logComponents. append ( " \( context. description) - " ) }
173
+
174
+ logComponents. append ( message)
175
+
60
176
let fullString = logComponents. joined ( separator: " " )
61
177
62
178
#if DEBUG
63
179
print ( fullString)
64
180
#endif
65
181
}
182
+
183
+ private static func formatLogMessage( _ message: Any ... ) -> String {
184
+ message. map { String ( describing: $0) } . joined ( separator: " " )
185
+ }
66
186
}
0 commit comments