Files
fgl-aircon/src/ayla/log.hpp
Petr Polezhaev b44004627b core(M0): монорепо-каркас — CMake (posix+esp-idf), платслой, лог, мини-httpd
- CMakeLists в корне: ветвление ESP_PLATFORM (idf_component_register,
  lwip/esp_timer/esp_hw_support/pthread) / POSIX (статическая библиотека
  fgl-aircon, C++20, -fno-exceptions -fno-rtti, -Werror).
- src/ayla/platform: сокеты/потоки/CSPRNG/время; posix (getrandom, poll,
  pthread_join) и esp-idf (lwip_select, esp_fill_random, pthread-слой IDF);
  tcp_shutdown/tcp_local_port/thread_join для управляемой остановки.
- src/ayla: log (sink, без printf); мини-httpd/1.1 (keep-alive, Content-Length,
  лимиты заголовков/тела, ephemeral-порт, жизненный цикл с гарантией
  завершения потока: shutdown(active)→join→close).
- tests/ayla: platform (join, loopback+shutdown) и httpd (404, keep-alive,
  обработчик/парсинг, oversize-400, stop при живом соединении, стрим
  заголовков). doctest через FetchContent.
- scripts/ci.sh: сборка+ctest. ESP-IDF v5.5.5 esp32: смоук-сборка с ядром
  как компонентом — Project build complete.
Ревью под-агентом: 3 круга, все блокеры (жизненный цикл httpd) закрыты, APPROVED.
2026-09-22 00:27:33 +03:00

33 lines
1.3 KiB
C++

// Логирование ядра: без printf в stdout, вывод через настраиваемый sink.
// Вызовы из внутреннего потока сессии; sink должен быть быстрым и реентерабельным.
#pragma once
#include <cstddef>
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__)