-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathLog.swift
122 lines (96 loc) · 3.64 KB
/
Log.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//
// Created by Pavel Dolezal on 26/06/15.
// Copyright (c) 2013 eMan s.r.o. All rights reserved.
//
import Foundation
/**
Simple logging tool for Swift projects.
Use global logger whenever possible:
#if DEBUG
Log.enabled = true
#endif
Log.level = .Info
Log.info("Hello \(name)")
Alternatively you can use custom logger which is useful mostly during
develompment time if you are debugging certain parts of the app:
let privateLogger = Log(level: .Debug)
privateLogger.debug("User tapped button")
*/
public class Log {
/// Log level indicates how serious the log entry is.
/// Lower number means higher priority.
public enum Level: Int {
case None, Error, Warn, Info, Debug
/// String representation for printing.
private var str: String {
switch(self) {
case .None: return ""
case .Error: return "ERROR"
case .Warn: return "WARN "
case .Info: return "INFO "
case .Debug: return "DEBUG"
}
}
}
/// Sets wether logging is enabled. Useful for keeping all logging off
/// for production deployment.
public static var enabled = false
/// Minimum log level for output. Levels with lower priority are ignored.
public var level: Level
public init(level: Level) {
self.level = level
}
private let dateFormatter: NSDateFormatter = {
let fmt = NSDateFormatter()
fmt.locale = NSLocale(localeIdentifier: "en_US")
fmt.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
return fmt
}()
// MARK: - Instance methods
private func log(level: Level, str: String, file: String = #file, line: Int = #line) {
if Log.enabled && level.rawValue <= self.level.rawValue {
let dateString = dateFormatter.stringFromDate(NSDate())
let url = NSURL(string: file)
let file: String = url?.lastPathComponent ?? "unknown"
NSLog("\(dateString) \(level.str) [\(file):\(line)]: \(str)")
}
}
/// Logs error if level is at least .Error.
public func error(str: String, file: String = #file, line: Int = #line) {
log(.Error, str: str, file: file, line: line)
}
/// Logs warning if level is at least .Warn.
public func warn(str: String, file: String = #file, line: Int = #line) {
log(.Warn, str: str, file: file, line: line)
}
/// Logs info if level is at least .Info.
public func info(str: String, file: String = #file, line: Int = #line) {
log(.Info, str: str, file: file, line: line)
}
/// Logs error if level is at least .Debug.
public func debug(str: String, file: String = #file, line: Int = #line) {
log(.Debug, str: str, file: file, line: line)
}
// MARK: - Shared logger
static var sharedLogger: Log = Log(level: .Info)
public static var level: Level {
get {
return sharedLogger.level
}
set {
sharedLogger.level = newValue
}
}
public static func error(str: String, file: String = #file, line: Int = #line) {
self.sharedLogger.error(str, file: file, line: line)
}
public static func warn(str: String, file: String = #file, line: Int = #line) {
self.sharedLogger.warn(str, file: file, line: line)
}
public static func info(str: String, file: String = #file, line: Int = #line) {
self.sharedLogger.info(str, file: file, line: line)
}
public static func debug(str: String, file: String = #file, line: Int = #line) {
self.sharedLogger.debug(str, file: file, line: line)
}
}