Skip to content

Commit 79b4350

Browse files
authored
Merge pull request #1 from SwiftMN/systemInfo
Add system info to all log messages
2 parents 048f2b7 + 00e4971 commit 79b4350

2 files changed

Lines changed: 61 additions & 29 deletions

File tree

README.md

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ It does not print to the console so you can use whatever LogHandler you want for
99

1010
add this to your `dependencies` list
1111
```swift
12-
.package(url: "https://github.com/SwiftMN/SumoLogHandler.git", from: "1.0.0")
12+
.package(url: "https://github.com/SwiftMN/SumoLogHandler.git", from: "2.0.0")
1313
```
1414

1515
and of course add `"EmojiLogHandler"` to your list target dependencies
@@ -32,22 +32,25 @@ https://github.com/SwiftMN/SumoLogHandler
3232
In your AppDelegate or SceneDelegate, bootstrap an instance of `SumoLogHandler`.
3333

3434
```swift
35-
if
36-
let sumoUrl = URL(string: sumoUrlString),
37-
let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String,
38-
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
39-
let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
40-
{
35+
if let sumoUrl = URL(string: sumoUrlString) {
36+
37+
let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "*"
38+
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "*"
39+
let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "*"
40+
4141
LoggingSystem.bootstrap { label in
4242
MultiplexLogHandler([
4343
EmojiLogHandler(label),
4444
SumoLogHandler(
4545
label: label,
4646
sumoUrl: sumoUrl,
47-
sumoName: "\(appName)/\(appVersion)/\(buildNumber)"
47+
sourceName: "\(appName)/\(appVersion)/\(buildNumber)"
4848
)
4949
])
5050
}
51+
52+
// make sure you register all handlers before setting logLevel since logger.logLevel just forwards to the handlers
53+
logger.logLevel = .info
5154
}
5255
```
5356

@@ -86,6 +89,20 @@ _sourceHost=ios
8689
_sourceName=sweet-project-name/*
8790
```
8891

92+
The log messages will look something like this
93+
```
94+
{
95+
"file": "MyClassName:62",
96+
"function": "myFunctionName(someVariable:)",
97+
"logLevel": "info",
98+
"machine": "iPad7,12",
99+
"message": "This is a log message",
100+
"systemName": "iOS",
101+
"systemVersion": "13.4",
102+
"timestamp": "2020-04-01T07:58:30.506-0500"
103+
}
104+
```
105+
89106

90107
## SumoLogic Setup
91108

Sources/SumoLogHandler/SumoLogHandler.swift

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@ import Logging
22
import Foundation
33
import Gzip
44
import ThreadSafeCollections
5+
import UIKit
56

67
private struct LogJson: Codable {
78
let message: String
89
let timestamp: String
910
let logLevel: String
10-
let thread: String
1111
let file: String
1212
let function: String
13+
let machine: String
14+
let systemName: String
15+
let systemVersion: String
1316
}
1417

1518
public class SumoLogHandler: LogHandler {
@@ -18,47 +21,57 @@ public class SumoLogHandler: LogHandler {
1821
public var logLevel: Logger.Level = .debug
1922
public let label: String
2023
public let sumoUrl: URL
21-
public let sumoName: String
22-
public let sumoHost: String
23-
public var sumoCategory: String
24+
public let sourceName: String
25+
public let sourceHost: String
26+
public var sourceCategory: String
2427
public let dateFormatter: DateFormatter
2528
public var thresholdPoints: Int = 10
2629

2730
private var urlSession = URLSession(configuration: URLSessionConfiguration.default)
28-
2931
private var currentLogs = ThreadSafeList<String>()
3032
private var currentPoints = 0
31-
33+
private let machine: String
34+
private let systemName: String
35+
private let systemVersion: String
36+
3237
public init(
33-
label: String, // some swift-log thing?
38+
label: String, // swift-log requires this
3439
sumoUrl: URL,
35-
sumoName: String,
36-
sumoHost: String = "ios",
37-
sumoCategory: String = "prod/mobile",
40+
sourceName: String,
41+
sourceHost: String = "ios",
42+
sourceCategory: String = "prod/mobile",
3843
dateFormatString: String = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
3944
) {
4045
self.label = label
4146
self.sumoUrl = sumoUrl
42-
self.sumoName = sumoName
43-
self.sumoHost = sumoHost
44-
self.sumoCategory = sumoCategory
47+
self.sourceName = sourceName
48+
self.sourceHost = sourceHost
49+
self.sourceCategory = sourceCategory
4550
let formatter = DateFormatter()
4651
formatter.dateFormat = dateFormatString
4752
self.dateFormatter = formatter
53+
54+
var systemInfo = utsname()
55+
uname(&systemInfo)
56+
self.machine = withUnsafeBytes(of: &systemInfo.machine) { rawPtr -> String in
57+
let ptr = rawPtr.baseAddress!.assumingMemoryBound(to: CChar.self)
58+
return String(cString: ptr)
59+
}
60+
self.systemName = UIDevice.current.systemName
61+
self.systemVersion = UIDevice.current.systemVersion
4862
}
4963

5064
public func log(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, file: String, function: String, line: UInt) {
5165
guard level >= logLevel else {
5266
print("not processing message with level = \(level)")
5367
return
5468
}
55-
let threadName = Thread.current.name ?? Thread.current.description
5669
DispatchQueue.global(qos: .background).async {
57-
self.process(level: level, message: message, metadata: metadata, file: file, function: function, line: line, threadName: threadName)
70+
self.process(level: level, message: message, metadata: metadata, file: file, function: function, line: line)
5871
}
5972
}
6073

61-
private func process(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, file: String, function: String, line: UInt, threadName: String) {
74+
private func process(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, file: String, function: String, line: UInt) {
6275

6376
var fileName = file
6477
if let fileWithoutExtension = file.components(separatedBy: "/").last?.components(separatedBy: ".").first {
@@ -69,9 +82,11 @@ public class SumoLogHandler: LogHandler {
6982
message: "\(message)",
7083
timestamp: dateFormatter.string(from: Date()),
7184
logLevel: level.rawValue,
72-
thread: threadName,
7385
file: "\(fileName):\(line)",
74-
function: function
86+
function: function,
87+
machine: self.machine,
88+
systemName: self.systemName,
89+
systemVersion: self.systemVersion
7590
)
7691

7792
guard let encoded = try? JSONEncoder().encode(json) else {
@@ -108,9 +123,9 @@ public class SumoLogHandler: LogHandler {
108123

109124
var request = URLRequest(url: sumoUrl)
110125
request.setValue("gzip", forHTTPHeaderField: "Content-Encoding")
111-
request.setValue(sumoName, forHTTPHeaderField: "X-Sumo-Name")
112-
request.setValue(sumoHost, forHTTPHeaderField: "X-Sumo-Host")
113-
request.setValue(sumoCategory, forHTTPHeaderField: "X-Sumo-Category")
126+
request.setValue(sourceName, forHTTPHeaderField: "X-Sumo-Name")
127+
request.setValue(sourceHost, forHTTPHeaderField: "X-Sumo-Host")
128+
request.setValue(sourceCategory, forHTTPHeaderField: "X-Sumo-Category")
114129
request.httpMethod = "POST"
115130

116131
let singleLog = logs.joined(separator: "\n")

0 commit comments

Comments
 (0)