CommandLineToolkit
79 строк · 2.3 Кб
1/*
2* Copyright (c) Avito Tech LLC
3*/
4
5import CLTLoggingModels
6import Foundation
7import ProcessController
8
9public enum SubprocessPipe: String {
10case stdout
11case stderr
12}
13
14public extension ContextualLogger {
15func attachToProcess(
16processController: ProcessController,
17persistentMetricsJobId: String? = nil,
18source: String? = nil,
19file: String = #fileID,
20function: String = #function,
21line: UInt = #line
22) {
23let work = { [weak self] (sender: ProcessController, data: Data, unsubscriber: Unsubscribe, subprocessPipe: SubprocessPipe) in
24guard let strongSelf = self else {
25unsubscriber()
26return
27}
28strongSelf.messageFromData(
29data,
30subprocessPipe: subprocessPipe,
31subprocessPidInfo: sender.subprocessInfo.pidInfo,
32persistentMetricsJobId: persistentMetricsJobId,
33source: source,
34file: file,
35function: function,
36line: line
37)
38}
39
40processController.onStdout { sender, data, unsubscriber in
41work(sender, data, unsubscriber, .stdout)
42}
43processController.onStderr { sender, data, unsubscriber in
44work(sender, data, unsubscriber, .stderr)
45}
46}
47
48private func messageFromData(
49_ data: Data,
50subprocessPipe: SubprocessPipe,
51subprocessPidInfo: PidInfo?,
52persistentMetricsJobId: String?,
53source: String?,
54file: String,
55function: String,
56line: UInt
57) {
58let logger = withMetadata(key: "subprocessPipe", value: subprocessPipe.rawValue)
59guard let string = String(data: data, encoding: .utf8) else {
60logger.error(
61"Failed to get string from data (\(data.count) bytes), BASE64: \(data.base64EncodedString())",
62subprocessPidInfo: subprocessPidInfo,
63source: source,
64file: file,
65function: function,
66line: line
67)
68return
69}
70logger.debug(
71string,
72subprocessPidInfo: subprocessPidInfo,
73source: source,
74file: file,
75function: function,
76line: line
77)
78}
79}
80