Skip to content

Commit

Permalink
Support of metadata in Sentry
Browse files Browse the repository at this point in the history
  • Loading branch information
mczachurski committed Feb 17, 2024
1 parent 7b6da5a commit 6c67150
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 26 deletions.
7 changes: 5 additions & 2 deletions Sources/ExtendedLogging/FileLogger.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@ public struct FileLogger: LogHandler {
logFormatter: LogFormatter = SingleLineFormatter(),
rollingInterval: RollingInteval = .day,
fileSizeLimitBytes: Int = 10485760) {
self.fileWriter = FileWriter(path: path, rollingInterval: rollingInterval, fileSizeLimitBytes: fileSizeLimitBytes)

self.label = label
self.logLevel = level
self.logFormatter = logFormatter

self.metadata = metadata
self.logFormatter = logFormatter
self.fileWriter = FileWriter(path: path, rollingInterval: rollingInterval, fileSizeLimitBytes: fileSizeLimitBytes)
self.logFormatter.metadata = metadata
}

public let label: String
Expand Down
43 changes: 24 additions & 19 deletions Sources/ExtendedLogging/SentryFormatter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@ import Foundation
import Logging

public class SentryFormatter: LogFormatter {
public var metadata = Logger.Metadata() {
didSet {
self.prettyMetadata = self.prettify(self.metadata)
}
}
public var metadata = Logger.Metadata()

private let application: String?
private let version: String?
private var prettyMetadata: String?
private var prettyMetadata: Dictionary<String, String> = [:]
private let jsonEncoder: JSONEncoder
private let newLine = "\n".data(using: .utf8)!

Expand All @@ -25,18 +21,11 @@ public class SentryFormatter: LogFormatter {
public func format(label: String,
level: Logger.Level,
message: Logger.Message,
metadata: Logger.Metadata?,
metadata logMetadata: Logger.Metadata?,
file: String,
function: String,
line: UInt) throws -> Data? {

// TODO: Save metadata as additional fields.
// let prettyMetadata = metadata?.isEmpty ?? true
// ? self.prettyMetadata
// : self.prettify(self.metadata.merging(metadata!, uniquingKeysWith: { _, new in new }))
// let messageLine = "(\(prettyMetadata.map { ", \($0)" } ?? "")): \(message)\n"

let eventId = UUID().uuidString // self.createRandomString(length: 32)
let eventId = UUID().uuidString
let currentDate = Date()

let header = EnvelopeHeader(eventId: eventId,
Expand All @@ -45,6 +34,7 @@ public class SentryFormatter: LogFormatter {

let type = EnvelopeType()
let content = self.getEnvelopeContent(level: level,
metadata: logMetadata,
message: message.description,
eventId: eventId,
logger: label,
Expand All @@ -61,12 +51,9 @@ public class SentryFormatter: LogFormatter {
return data
}

private func prettify(_ metadata: Logger.Metadata) -> String? {
return !metadata.isEmpty ? metadata.map { "\($0)=\($1)" }.joined(separator: " ") : nil
}

private func getEnvelopeContent(
level: Logger.Level,
metadata logMetadata: Logger.Metadata?,
message: String,
eventId: String,
logger: String,
Expand All @@ -86,6 +73,7 @@ public class SentryFormatter: LogFormatter {
timestamp: currentDate.timeIntervalSince1970,
environment: "production",
contexts: EnvelopeContext(name: self.application, version: self.version),
extra: self.getExtraData(metadata: logMetadata),
message: nil,
exception: EnvelopeErrorValues(values: [
EnvelopeErrorValue(type: "Error",
Expand All @@ -105,11 +93,28 @@ public class SentryFormatter: LogFormatter {
timestamp: currentDate.timeIntervalSince1970,
environment: "production",
contexts: EnvelopeContext(name: self.application, version: self.version),
extra: self.getExtraData(metadata: logMetadata),
message: message,
exception: nil)
}
}

private func getExtraData(metadata logMetadata: Logger.Metadata?) -> Dictionary<String, String> {
var extra: Dictionary<String, String> = [:]

self.metadata.forEach({ (key: String, value: Logger.MetadataValue) in
extra[key] = value.description
})

if let logMetadata {
logMetadata.forEach({ (key: String, value: Logger.MetadataValue) in
extra[key] = value.description
})
}

return extra
}

private func getServerName() -> String {
return Host.current().localizedName ?? ""
}
Expand Down
12 changes: 7 additions & 5 deletions Sources/ExtendedLogging/SentryLogger.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import Foundation
import Logging

public struct SentryLogger: LogHandler {

public var metadata = Logger.Metadata() {
didSet {
self.logFormatter.metadata = self.metadata
Expand All @@ -19,26 +18,29 @@ public struct SentryLogger: LogHandler {
version: String? = nil,
level: Logger.Level = .debug,
metadata: Logger.Metadata = [:]) {
self.logFormatter = SentryFormatter(application: application, version: version)
self.sentryWriter = SentryWriter(dsn: dsn)

self.label = label
self.logLevel = level

self.metadata = metadata
self.logFormatter = SentryFormatter(application: application, version: version)
self.sentryWriter = SentryWriter(dsn: dsn)
self.logFormatter.metadata = metadata
}

public let label: String

public func log(level: Logger.Level,
message: Logger.Message,
metadata: Logger.Metadata?,
metadata logMetadata: Logger.Metadata?,
file: String,
function: String,
line: UInt) {

let message = try? self.logFormatter.format(label: self.label,
level: level,
message: message,
metadata: metadata,
metadata: logMetadata,
file: file,
function: function,
line: line)
Expand Down
2 changes: 2 additions & 0 deletions Sources/ExtendedLogging/SentryModels/EnvelopeContent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ internal struct EnvelopeContent: Encodable {
let timestamp: Double
let environment: String
let contexts: EnvelopeContext
let extra: Dictionary<String, String>
let message: String?
let exception: EnvelopeErrorValues?

Expand All @@ -22,6 +23,7 @@ internal struct EnvelopeContent: Encodable {
case timestamp
case environment
case contexts
case extra
case message
case exception
}
Expand Down

0 comments on commit 6c67150

Please sign in to comment.