summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadLogging/Logging.swift
blob: 9120dcb88687a2d5a5a8b2ac1b9490cc729429ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//
//  Logging.swift
//  MullvadVPN
//
//  Created by pronebird on 02/08/2020.
//  Copyright © 2020 Mullvad VPN AB. All rights reserved.
//

import Foundation
@_exported import Logging

public func initLoggingSystem(
    bundleIdentifier: String,
    applicationGroupIdentifier: String,
    metadata: Logger.Metadata? = nil
) {
    let containerURL = FileManager.default.containerURL(
        forSecurityApplicationGroupIdentifier: applicationGroupIdentifier
    )!
    let logsDirectoryURL = containerURL.appendingPathComponent("Logs", isDirectory: true)
    let logFileName = "\(bundleIdentifier).log"
    let logFileURL = logsDirectoryURL.appendingPathComponent(logFileName)

    // Create Logs folder within container if it doesn't exist
    try? FileManager.default.createDirectory(
        at: logsDirectoryURL,
        withIntermediateDirectories: false,
        attributes: nil
    )

    // Rotate log
    var logRotationError: Error?
    do {
        try LogRotation.rotateLog(
            logsDirectory: logsDirectoryURL,
            logFileName: logFileName
        )
    } catch {
        logRotationError = error
    }

    // Create an array of log output streams
    var streams: [TextOutputStream] = []

    // Create output stream to file
    if let fileLogStream = TextFileOutputStream(fileURL: logFileURL, createFile: true) {
        streams.append(fileLogStream)
    }

    // Configure Logging system
    LoggingSystem.bootstrap { label -> LogHandler in
        var logHandlers: [LogHandler] = []

        #if DEBUG
        logHandlers.append(OSLogHandler(subsystem: bundleIdentifier, category: label))
        #endif

        if !streams.isEmpty {
            logHandlers.append(CustomFormatLogHandler(label: label, streams: streams))
        }

        if logHandlers.isEmpty {
            return SwiftLogNoOpLogHandler()
        } else {
            var multiplex = MultiplexLogHandler(logHandlers)
            if let metadata = metadata {
                multiplex.metadata = metadata
            }
            return multiplex
        }
    }

    if let logRotationError = logRotationError {
        Logger(label: "LogRotation").error(
            error: logRotationError,
            message: "Failed to rotate log"
        )
    }
}