CommandLineToolkit

Форк
0
/
FileHandleLoggerHandler.swift 
82 строки · 3.2 Кб
1
/*
2
 * Copyright (c) Avito Tech LLC
3
 */
4

5
import AtomicModels
6
import DateProvider
7
import CLTLoggingModels
8
import Foundation
9

10
public final class FileHandleLoggerHandler: LoggerHandler {
11
    private let dateProvider: DateProvider
12
    private let fileState: AtomicValue<FileState>
13
    private let logEntryTextFormatter: LogEntryTextFormatter
14
    private let fileHandleShouldBeClosed: Bool
15
    private let skipMetadataFlag: SkipMetadataFlags?
16
    private let coordinateNamesToSkipFromTextualOutput: Set<String>
17
    
18
    public enum SkipMetadataFlags: String {
19
        case skipStdOutput
20
        case skipFileOutput
21
    }
22

23
    public init(
24
        dateProvider: DateProvider,
25
        fileHandle: FileHandle,
26
        logEntryTextFormatter: LogEntryTextFormatter,
27
        fileHandleShouldBeClosed: Bool,
28
        skipMetadataFlag: SkipMetadataFlags?,
29
        coordinateNamesToSkipFromTextualOutput: Set<String> = ContextualLogger.ContextKeys.stringSetForAllRawValues()
30
    ) {
31
        self.dateProvider = dateProvider
32
        self.fileState = AtomicValue(FileState.open(fileHandle))
33
        self.logEntryTextFormatter = logEntryTextFormatter
34
        self.fileHandleShouldBeClosed = fileHandleShouldBeClosed
35
        self.skipMetadataFlag = skipMetadataFlag
36
        self.coordinateNamesToSkipFromTextualOutput = coordinateNamesToSkipFromTextualOutput
37
    }
38
    
39
    public func handle(logEntry: LogEntry) {
40
        if let skipMetadataFlag = skipMetadataFlag, logEntry.coordinates.contains(where: { $0.name == skipMetadataFlag.rawValue }) {
41
            return
42
        }
43
        
44
        var coordinates = logEntry.coordinates.filter {
45
            !coordinateNamesToSkipFromTextualOutput.contains($0.name)
46
        }
47
        
48
        if let subprocessId = logEntry.coordinate(name: ContextualLogger.ContextKeys.subprocessId.rawValue)?.value {
49
            if let xcrunToolName = logEntry.coordinate(name: ContextualLogger.ContextKeys.xcrunToolName.rawValue)?.value {
50
                coordinates.append(LogEntryCoordinate(name: xcrunToolName, value: "\(subprocessId)"))
51
            } else if let subprocessName = logEntry.coordinate(name: ContextualLogger.ContextKeys.subprocessName.rawValue)?.value {
52
                coordinates.append(LogEntryCoordinate(name: subprocessName, value: "\(subprocessId)"))
53
            }
54
        }
55
        
56
        let logEntry = logEntry.with(coordinates: coordinates)
57
        
58
        let text = logEntryTextFormatter.format(logEntry: logEntry)
59
        fileState.withExclusiveAccess { fileState in
60
            guard var fileHandle = fileState.openedFileHandle else { return }
61
            print(text, to: &fileHandle)
62
        }
63
    }
64
    
65
    public func tearDownLogging(timeout: TimeInterval) {
66
        fileState.withExclusiveAccess { fileState in
67
            if fileHandleShouldBeClosed {
68
                fileState.close()
69
            }
70
        }
71
    }
72
}
73

74
extension ContextualLogger {
75
    public var skippingStdOutput: ContextualLogger {
76
        withMetadata(key: FileHandleLoggerHandler.SkipMetadataFlags.skipStdOutput.rawValue, value: nil)
77
    }
78
    
79
    public var skippingFileLogOutput: ContextualLogger {
80
        withMetadata(key: FileHandleLoggerHandler.SkipMetadataFlags.skipFileOutput.rawValue, value: nil)
81
    }
82
}
83

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

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

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

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