diff --git a/apps/desktop/src/app/main.cpp b/apps/desktop/src/app/main.cpp index 2f44b7cf..bf489082 100644 --- a/apps/desktop/src/app/main.cpp +++ b/apps/desktop/src/app/main.cpp @@ -22,6 +22,7 @@ #include "config_center.h" #include "daemon.h" #include "path_manager.h" +#include "rd_log.h" #include "render.h" #ifdef __linux__ @@ -192,6 +193,14 @@ int main(int argc, char* argv[]) { std::strcmp(argv[1], crossdesk::kSlintRendererProbeArgument) == 0) { return crossdesk::RunSlintRendererProbe(); } +#endif + + // Service operations and config migration can log before the GUI starts. + // Configure the directory first, including CLI and daemon child paths. + auto path_manager = std::make_unique("CrossDesk"); + crossdesk::InitLogger(path_manager->GetLogPath().string()); + +#ifdef _WIN32 if (argc > 1 && IsServiceCliCommand(argv[1])) { return HandleServiceCliCommand(argv[1]); } @@ -218,7 +227,6 @@ int main(int argc, char* argv[]) { #endif bool enable_daemon = false; - auto path_manager = std::make_unique("CrossDesk"); if (path_manager) { std::string cache_path = path_manager->GetCachePath().string(); crossdesk::ConfigCenter config_center(cache_path + "/config.ini"); diff --git a/apps/desktop/src/gui/application/gui_application.cpp b/apps/desktop/src/gui/application/gui_application.cpp index ed116e9b..fe2843a9 100644 --- a/apps/desktop/src/gui/application/gui_application.cpp +++ b/apps/desktop/src/gui/application/gui_application.cpp @@ -950,10 +950,10 @@ int GuiApplication::Run() { } exec_log_path_ = path_manager_->GetLogPath().string(); dll_log_path_ = exec_log_path_; + InitializeLogger(); cache_path_ = path_manager_->GetCachePath().string(); config_center_ = std::make_unique(cache_path_ + "/config.ini"); - InitializeLogger(); LOG_INFO("CrossDesk version: {} (Slint UI)", CROSSDESK_VERSION); strncpy(signal_server_ip_self_, config_center_->GetSignalServerHost().c_str(), diff --git a/apps/desktop/src/log/rd_log.cpp b/apps/desktop/src/log/rd_log.cpp index 5d8a65e4..1f5731ea 100644 --- a/apps/desktop/src/log/rd_log.cpp +++ b/apps/desktop/src/log/rd_log.cpp @@ -1,6 +1,5 @@ #include "rd_log.h" -#include #include namespace crossdesk { @@ -9,26 +8,38 @@ namespace { std::string g_log_dir = "logs"; std::once_flag g_logger_once_flag; +std::mutex g_logger_mutex; std::shared_ptr g_logger; -std::atomic g_logger_created{false}; + +std::string NormalizeLogDirectory(const std::string& log_dir) { + const std::filesystem::path path = log_dir.empty() ? "logs" : log_dir; + std::error_code ec; + const auto absolute = std::filesystem::absolute(path, ec); + return (ec ? path : absolute).lexically_normal().string(); +} } // namespace void InitLogger(const std::string& log_dir) { - if (g_logger_created.load()) { - LOG_WARN( - "InitLogger called after logger initialized. Ignoring log_dir: {}, " - "using previous log_dir: {}", - log_dir, g_log_dir); + const auto directory = NormalizeLogDirectory(log_dir); + std::lock_guard lock(g_logger_mutex); + if (g_logger) { + if (directory != g_log_dir) { + g_logger->warn( + "InitLogger called after logger initialized. Ignoring log_dir: {}, " + "using previous log_dir: {}", + directory, g_log_dir); + } return; } - g_log_dir = log_dir; + g_log_dir = directory; } std::shared_ptr get_logger() { std::call_once(g_logger_once_flag, []() { - g_logger_created.store(true); + std::lock_guard lock(g_logger_mutex); + g_log_dir = NormalizeLogDirectory(g_log_dir); std::error_code ec; std::filesystem::create_directories(g_log_dir, ec); @@ -54,10 +65,12 @@ std::shared_ptr get_logger() { sinks.push_back(std::make_shared( filename, 5 * 1024 * 1024, 3)); - g_logger = std::make_shared(LOGGER_NAME, sinks.begin(), - sinks.end()); - g_logger->flush_on(spdlog::level::info); - spdlog::register_logger(g_logger); + auto logger = std::make_shared(LOGGER_NAME, sinks.begin(), + sinks.end()); + logger->flush_on(spdlog::level::info); + spdlog::register_logger(logger); + logger->info("Logger initialized: path={}", filename); + g_logger = std::move(logger); }); return g_logger; diff --git a/deps/submodules/minirtc b/deps/submodules/minirtc index 6931e635..5b0ce343 160000 --- a/deps/submodules/minirtc +++ b/deps/submodules/minirtc @@ -1 +1 @@ -Subproject commit 6931e63554dc64037e264e741f67e66d90b00bdb +Subproject commit 5b0ce34383f95ae97a01af9e0985c0628b25ad04