-
Notifications
You must be signed in to change notification settings - Fork 13
/
Log.swift
159 lines (141 loc) · 5.06 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Log.swift
//
// Created by Dalton Cherry on 12/23/14.
// Copyright (c) 2014 Vluxe. All rights reserved.
//
// Simple logging class.
//////////////////////////////////////////////////////////////////////////////////////////////////
import Foundation
///The log class containing all the needed methods
open class Log {
///The max size a log file can be in Kilobytes. Default is 1024 (1 MB)
open var maxFileSize: UInt64 = 1024
///The max number of log file that will be stored. Once this point is reached, the oldest file is deleted.
open var maxFileCount = 4
///The directory in which the log files will be written
open var directory = Log.defaultDirectory() {
didSet {
directory = NSString(string: directory).expandingTildeInPath
let fileManager = FileManager.default
if !fileManager.fileExists(atPath: directory) {
do {
try fileManager.createDirectory(atPath: directory, withIntermediateDirectories: true, attributes: nil)
} catch {
NSLog("Couldn't create directory at \(directory)")
}
}
}
}
open var currentPath: String {
return "\(directory)/\(logName(0))"
}
///The name of the log files
open var name = "logfile"
///Whether or not logging also prints to the console
open var printToConsole = true
///logging singleton
open class var logger: Log {
struct Static {
static let instance: Log = Log()
}
return Static.instance
}
//the date formatter
var dateFormatter: DateFormatter {
let formatter = DateFormatter()
formatter.timeStyle = .medium
formatter.dateStyle = .medium
return formatter
}
///write content to the current log file.
open func write(_ text: String) {
let path = currentPath
let fileManager = FileManager.default
if !fileManager.fileExists(atPath: path) {
do {
try "".write(toFile: path, atomically: true, encoding: String.Encoding.utf8)
} catch _ {
}
}
if let fileHandle = FileHandle(forWritingAtPath: path) {
let dateStr = dateFormatter.string(from: Date())
let writeText = "[\(dateStr)]: \(text)\n"
fileHandle.seekToEndOfFile()
fileHandle.write(writeText.data(using: String.Encoding.utf8)!)
fileHandle.closeFile()
if printToConsole {
print(writeText, terminator: "")
}
cleanup()
}
}
///do the checks and cleanup
func cleanup() {
let path = "\(directory)/\(logName(0))"
let size = fileSize(path)
let maxSize: UInt64 = maxFileSize*1024
if size > 0 && size >= maxSize && maxSize > 0 && maxFileCount > 0 {
rename(0)
//delete the oldest file
let deletePath = "\(directory)/\(logName(maxFileCount))"
let fileManager = FileManager.default
do {
try fileManager.removeItem(atPath: deletePath)
} catch _ {
}
}
}
///check the size of a file
func fileSize(_ path: String) -> UInt64 {
let fileManager = FileManager.default
let attrs: NSDictionary? = try? fileManager.attributesOfItem(atPath: path) as NSDictionary
if let dict = attrs {
return dict.fileSize()
}
return 0
}
///Recursive method call to rename log files
func rename(_ index: Int) {
let fileManager = FileManager.default
let path = "\(directory)/\(logName(index))"
let newPath = "\(directory)/\(logName(index+1))"
if fileManager.fileExists(atPath: newPath) {
rename(index+1)
}
do {
try fileManager.moveItem(atPath: path, toPath: newPath)
} catch _ {
}
}
///gets the log name
func logName(_ num :Int) -> String {
return "\(name)-\(num).log"
}
///get the default log directory
class func defaultDirectory() -> String {
var path = ""
let fileManager = FileManager.default
#if os(iOS)
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
path = "\(paths[0])/Logs"
#elseif os(macOS)
let urls = fileManager.urls(for: .libraryDirectory, in: .userDomainMask)
if let url = urls.last {
path = "\(url.path)/Logs"
}
#endif
if !fileManager.fileExists(atPath: path) && path != "" {
do {
try fileManager.createDirectory(atPath: path, withIntermediateDirectories: false, attributes: nil)
} catch _ {
}
}
return path
}
}
///Writes content to the current log file
public func logw(_ text: String) {
Log.logger.write(text)
}