// Логирование ядра: без printf в stdout, вывод через настраиваемый sink. // Вызовы из внутреннего потока сессии; sink должен быть быстрым и реентерабельным. #pragma once #include namespace fgl::ayla::log { enum Level : int { kDebug = 0, kInfo = 1, kWarn = 2, kError = 3, }; using Sink = void (*)(int level, const char* msg, size_t len, void* ctx); // Устанавливает приёмник логов (глобально). nullptr — логирование отключено. void set_sink(Sink sink, void* ctx); // Форматирует в фиксированный буфер (без кучи) и отправляет в sink. void write(int level, const char* fmt, ...) __attribute__((format(printf, 2, 3))); int min_level(); // по умолчанию kInfo void set_min_level(int level); } // namespace fgl::ayla::log #define FGL_LOGD(...) ::fgl::ayla::log::write(::fgl::ayla::log::kDebug, __VA_ARGS__) #define FGL_LOGI(...) ::fgl::ayla::log::write(::fgl::ayla::log::kInfo, __VA_ARGS__) #define FGL_LOGW(...) ::fgl::ayla::log::write(::fgl::ayla::log::kWarn, __VA_ARGS__) #define FGL_LOGE(...) ::fgl::ayla::log::write(::fgl::ayla::log::kError, __VA_ARGS__)