Мое ведение журнала может происходить из любого потока, и я хотел бы иметь способ связать журналы с контекстом. Функция 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")
Однако это немного наладочных работ