CommandLineToolkit

Форк
0
/
ContextualLogger+ProcessController.swift 
79 строк · 2.3 Кб
1
/*
2
 * Copyright (c) Avito Tech LLC
3
 */
4

5
import CLTLoggingModels
6
import Foundation
7
import ProcessController
8

9
public enum SubprocessPipe: String {
10
    case stdout
11
    case stderr
12
}
13

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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.