CommandLineToolkit
63 строки · 1.6 Кб
1/*
2* Copyright (c) Avito Tech LLC
3*/
4
5import CLTLoggingModels
6import Foundation
7import Kibana
8
9public final class KibanaLoggerHandler: LoggerHandler {
10private let group = DispatchGroup()
11private let kibanaClient: KibanaClient
12
13public enum SkipMetadataFlags: String {
14case skippingKibana
15}
16
17public init(kibanaClient: KibanaClient) {
18self.kibanaClient = kibanaClient
19}
20
21public func handle(logEntry: LogEntry) {
22guard !logEntry.coordinates.contains(where: { $0.name == SkipMetadataFlags.skippingKibana.rawValue }) else {
23return
24}
25
26do {
27var kibanaPayload = [
28"fileLine": "\(logEntry.file):\(logEntry.line)"
29]
30
31for keyValue in logEntry.coordinates {
32kibanaPayload[keyValue.name] = keyValue.value ?? "null"
33}
34
35group.enter()
36try kibanaClient.send(
37level: logEntry.verbosity.levelForKibana,
38message: logEntry.message,
39metadata: kibanaPayload
40) { [group] _ in
41group.leave()
42}
43} catch {
44group.leave()
45}
46}
47
48public func tearDownLogging(timeout: TimeInterval) {
49_ = group.wait(timeout: .now() + timeout)
50}
51}
52
53extension ContextualLogger {
54public var skippingKibana: ContextualLogger {
55withMetadata(key: KibanaLoggerHandler.SkipMetadataFlags.skippingKibana.rawValue, value: nil)
56}
57}
58
59extension Verbosity {
60var levelForKibana: String {
61stringCode.lowercased()
62}
63}
64