Автоматически передавать контекст уровня класса всем функциям - PullRequest
0 голосов
/ 13 июля 2020

Мое ведение журнала может происходить из любого потока, и я хотел бы иметь способ связать журналы с контекстом. Функция log принимает параметр контекста Any?, который я могу использовать позже в выводе журнала, чтобы определить, что эти журналы были получены из одного и того же контекста, например процесса.

Я не верю, что это возможно , но я хотел бы передать переменную контекста всем функциям журнала без необходимости писать этот код.

Одним из примеров является функция # file / # line / #, но я хочу иметь возможность определить одну глобально для файла. Есть ли более простой способ передать такой контекст?

Вот пример того, как я использую ведение журнала:

class MyProcess {
    let context: String
    init() {
        context = "process_1"
    }
    func doThing() {
        LogDebug("message", context)
        let d = Dependency(context: context)
        d.doSomethingElse()
    }
}

Проблема в том, что очень легко забыть передать контекст. Мне нужен более гарантированный / безопасный способ компиляции для обеспечения такого поведения. И я хочу сделать аргумент context необязательным, если мне не важен контекст этого журнала.

Одной из моих идей было создание функций в глобальной области видимости файла и создание оболочек функций, которые передаются в контексте и переопределяют глобальные функции области видимости модуля:

// Top of the file:
private var LogDebug: ((String) -> Void)!
private var LogError: ((String) -> Void)!

// In class init:
(LogDebug, LogError) = CreateLoggerWrappers(context: "process_1")

Однако это немного наладочных работ

...