diff --git a/src/log/log.cpp b/src/log/log.cpp new file mode 100644 index 0000000..caec4e9 --- /dev/null +++ b/src/log/log.cpp @@ -0,0 +1,62 @@ +#include "log.h" + +#include +#include + +namespace { + +std::string g_log_dir = "logs"; +std::once_flag g_logger_once_flag; +std::shared_ptr g_logger; +std::atomic g_logger_created{false}; + +} // 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); + return; + } + + g_log_dir = log_dir; +} + +std::shared_ptr get_logger() { + std::call_once(g_logger_once_flag, []() { + g_logger_created.store(true); + + std::error_code ec; + std::filesystem::create_directories(g_log_dir, ec); + + auto now = std::chrono::system_clock::now() + std::chrono::hours(8); + auto now_time = std::chrono::system_clock::to_time_t(now); + + std::tm tm_info; +#ifdef _WIN32 + gmtime_s(&tm_info, &now_time); +#else + gmtime_r(&now_time, &tm_info); +#endif + + std::stringstream ss; + ss << LOGGER_NAME; + ss << std::put_time(&tm_info, "-%Y%m%d-%H%M%S.log"); + + std::string filename = g_log_dir + "/" + ss.str(); + + std::vector sinks; + sinks.push_back(std::make_shared()); + 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); + }); + + return g_logger; +} diff --git a/src/log/log.h b/src/log/log.h index c8d7280..b662d1f 100644 --- a/src/log/log.h +++ b/src/log/log.h @@ -1,11 +1,20 @@ +/* + * @Author: DI JUNKUN + * @Date: 2025-09-08 + * Copyright (c) 2025 by DI JUNKUN, All Rights Reserved. + */ + #ifndef _LOG_H_ #define _LOG_H_ #include #include #include +#include +#include #include #include +#include #include "spdlog/common.h" #include "spdlog/logger.h" @@ -14,114 +23,17 @@ #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/spdlog.h" -using namespace std::chrono; - #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO -// SPDLOG_TRACE(...) -// SPDLOG_DEBUG(...) -// SPDLOG_INFO(...) -// SPDLOG_WARN(...) -// SPDLOG_ERROR(...) -// SPDLOG_CRITICAL(...) +constexpr auto LOGGER_NAME = "crossdesk-server"; -#ifdef SIGNAL_LOGGER -constexpr auto LOGGER_NAME = "siganl_server"; -#else -constexpr auto LOGGER_NAME = "remote_desk"; -#endif +void InitLogger(const std::string& log_dir); -#define LOG_INFO(...) \ - if (nullptr == spdlog::get(LOGGER_NAME)) { \ - auto now = std::chrono::system_clock::now() + std::chrono::hours(8); \ - auto timet = std::chrono::system_clock::to_time_t(now); \ - auto localTime = *std::gmtime(&timet); \ - std::stringstream ss; \ - std::string filename; \ - ss << LOGGER_NAME; \ - ss << std::put_time(&localTime, "-%Y%m%d-%H%M%S.log"); \ - ss >> filename; \ - std::string path = "logs/" + filename; \ - std::vector sinks; \ - sinks.push_back(std::make_shared()); \ - sinks.push_back(std::make_shared( \ - path, 1048576 * 5, 3)); \ - auto combined_logger = std::make_shared( \ - LOGGER_NAME, begin(sinks), end(sinks)); \ - combined_logger->flush_on(spdlog::level::info); \ - spdlog::register_logger(combined_logger); \ - SPDLOG_LOGGER_INFO(combined_logger, __VA_ARGS__); \ - } else { \ - SPDLOG_LOGGER_INFO(spdlog::get(LOGGER_NAME), __VA_ARGS__); \ - } +std::shared_ptr get_logger(); -#define LOG_WARN(...) \ - if (nullptr == spdlog::get(LOGGER_NAME)) { \ - auto now = std::chrono::system_clock::now() + std::chrono::hours(8); \ - auto timet = std::chrono::system_clock::to_time_t(now); \ - auto localTime = *std::gmtime(&timet); \ - std::stringstream ss; \ - std::string filename; \ - ss << LOGGER_NAME; \ - ss << std::put_time(&localTime, "-%Y%m%d-%H%M%S.log"); \ - ss >> filename; \ - std::string path = "logs/" + filename; \ - std::vector sinks; \ - sinks.push_back(std::make_shared()); \ - sinks.push_back(std::make_shared( \ - path, 1048576 * 5, 3)); \ - auto combined_logger = std::make_shared( \ - LOGGER_NAME, begin(sinks), end(sinks)); \ - spdlog::register_logger(combined_logger); \ - SPDLOG_LOGGER_WARN(combined_logger, __VA_ARGS__); \ - } else { \ - SPDLOG_LOGGER_WARN(spdlog::get(LOGGER_NAME), __VA_ARGS__); \ - } +#define LOG_INFO(...) SPDLOG_LOGGER_INFO(get_logger(), __VA_ARGS__) +#define LOG_WARN(...) SPDLOG_LOGGER_WARN(get_logger(), __VA_ARGS__) +#define LOG_ERROR(...) SPDLOG_LOGGER_ERROR(get_logger(), __VA_ARGS__) +#define LOG_FATAL(...) SPDLOG_LOGGER_CRITICAL(get_logger(), __VA_ARGS__) -#define LOG_ERROR(...) \ - if (nullptr == spdlog::get(LOGGER_NAME)) { \ - auto now = std::chrono::system_clock::now() + std::chrono::hours(8); \ - auto timet = std::chrono::system_clock::to_time_t(now); \ - auto localTime = *std::gmtime(&timet); \ - std::stringstream ss; \ - std::string filename; \ - ss << LOGGER_NAME; \ - ss << std::put_time(&localTime, "-%Y%m%d-%H%M%S.log"); \ - ss >> filename; \ - std::string path = "logs/" + filename; \ - std::vector sinks; \ - sinks.push_back(std::make_shared()); \ - sinks.push_back(std::make_shared( \ - path, 1048576 * 5, 3)); \ - auto combined_logger = std::make_shared( \ - LOGGER_NAME, begin(sinks), end(sinks)); \ - spdlog::register_logger(combined_logger); \ - SPDLOG_LOGGER_ERROR(combined_logger, __VA_ARGS__); \ - } else { \ - SPDLOG_LOGGER_ERROR(spdlog::get(LOGGER_NAME), __VA_ARGS__); \ - } - -#define LOG_FATAL(...) \ - if (nullptr == spdlog::get(LOGGER_NAME)) { \ - auto now = std::chrono::system_clock::now() + std::chrono::hours(8); \ - auto timet = std::chrono::system_clock::to_time_t(now); \ - auto localTime = *std::gmtime(&timet); \ - std::stringstream ss; \ - std::string filename; \ - ss << LOGGER_NAME; \ - ss << std::put_time(&localTime, "-%Y%m%d-%H%M%S.log"); \ - ss >> filename; \ - std::string path = "logs/" + filename; \ - std::vector sinks; \ - sinks.push_back(std::make_shared()); \ - sinks.push_back(std::make_shared( \ - path, 1048576 * 5, 3)); \ - auto combined_logger = std::make_shared( \ - LOGGER_NAME, begin(sinks), end(sinks)); \ - spdlog::register_logger(combined_logger); \ - SPDLOG_LOGGER_CRITICAL(combined_logger, __VA_ARGS__); \ - } else { \ - SPDLOG_LOGGER_CRITICAL(spdlog::get(LOGGER_NAME), __VA_ARGS__); \ - } - -#endif +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 202230d..cbf9018 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,17 +1,33 @@ +/* + * @Author: DI JUNKUN + * @Date: 2025-09-08 + * Copyright (c) 2025 by DI JUNKUN, All Rights Reserved. + */ + +#ifndef _MAIN_H_ +#define _MAIN_H_ #include +#include "log/log.h" #include "signal_server.h" int main(int argc, char* argv[]) { SignalServer s; - std::string port = ""; + std::string port = "9090"; + std::string log_dir = "./logs"; + if (argc > 1) { port = argv[1]; - } else { - port = "9090"; } - s.run(std::stoi(port)); + if (argc > 2) { + log_dir = argv[2]; + } + + InitLogger(log_dir); + s.Run(std::stoi(port)); return 0; -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/src/signal_server.cpp b/src/signal_server.cpp index 57488b6..4406ddc 100644 --- a/src/signal_server.cpp +++ b/src/signal_server.cpp @@ -12,39 +12,39 @@ SignalServer::SignalServer() { server_.init_asio(); server_.set_open_handler( - std::bind(&SignalServer::on_open, this, std::placeholders::_1)); + std::bind(&SignalServer::OnOpen, this, std::placeholders::_1)); server_.set_close_handler( - std::bind(&SignalServer::on_close, this, std::placeholders::_1)); + std::bind(&SignalServer::OnClose, this, std::placeholders::_1)); server_.set_fail_handler( - std::bind(&SignalServer::on_fail, this, std::placeholders::_1)); - server_.set_message_handler(std::bind(&SignalServer::on_message, this, + std::bind(&SignalServer::OnFail, this, std::placeholders::_1)); + server_.set_message_handler(std::bind(&SignalServer::OnMessage, this, std::placeholders::_1, std::placeholders::_2)); server_.set_tls_init_handler( - std::bind(&SignalServer::on_tls_init, this, std::placeholders::_1)); - server_.set_ping_handler(std::bind(&SignalServer::on_ping, this, + std::bind(&SignalServer::OnTlsInit, this, std::placeholders::_1)); + server_.set_ping_handler(std::bind(&SignalServer::OnPing, this, std::placeholders::_1, std::placeholders::_2)); - server_.set_pong_handler(std::bind(&SignalServer::on_pong, this, + server_.set_pong_handler(std::bind(&SignalServer::OnPing, this, std::placeholders::_1, std::placeholders::_2)); transmission_manager_ = std::make_shared(); signal_negotiation_ = std::make_unique(transmission_manager_); - signal_negotiation_->SetSendMsgCallback(std::bind(&SignalServer::send_msg, + signal_negotiation_->SetSendMsgCallback(std::bind(&SignalServer::SendMsg, this, std::placeholders::_1, std::placeholders::_2)); } SignalServer::~SignalServer() {} -bool SignalServer::on_open(websocketpp::connection_hdl hdl) { +bool SignalServer::OnOpen(websocketpp::connection_hdl hdl) { ws_connections_[hdl] = ws_connection_id_++; return true; } -bool SignalServer::on_close(websocketpp::connection_hdl hdl) { +bool SignalServer::OnClose(websocketpp::connection_hdl hdl) { std::string user_id = transmission_manager_->ReleaseUserFromWsHandle(hdl); if (!user_id.empty()) { LOG_INFO("Websocket connection [{}|{}] closed", ws_connections_[hdl], @@ -54,7 +54,7 @@ bool SignalServer::on_close(websocketpp::connection_hdl hdl) { return true; } -bool SignalServer::on_fail(websocketpp::connection_hdl hdl) { +bool SignalServer::OnFail(websocketpp::connection_hdl hdl) { std::string user_id = transmission_manager_->ReleaseUserFromWsHandle(hdl); if (!user_id.empty()) { LOG_INFO("Websocket connection [{}|{}] failed", ws_connections_[hdl], @@ -63,7 +63,7 @@ bool SignalServer::on_fail(websocketpp::connection_hdl hdl) { return true; } -context_ptr SignalServer::on_tls_init(websocketpp::connection_hdl hdl) { +context_ptr SignalServer::OnTlsInit(websocketpp::connection_hdl hdl) { namespace asio = websocketpp::lib::asio; context_ptr ctx = websocketpp::lib::make_shared( asio::ssl::context::sslv23); @@ -87,16 +87,16 @@ context_ptr SignalServer::on_tls_init(websocketpp::connection_hdl hdl) { return ctx; } -bool SignalServer::on_ping(websocketpp::connection_hdl hdl, std::string s) { +bool SignalServer::OnPing(websocketpp::connection_hdl hdl, std::string s) { transmission_manager_->UpdateWsHandleLastActiveTime(hdl); return true; } -bool SignalServer::on_pong(websocketpp::connection_hdl hdl, std::string s) { +bool SignalServer::OnPong(websocketpp::connection_hdl hdl, std::string s) { return true; } -void SignalServer::run(uint16_t port) { +void SignalServer::Run(uint16_t port) { server_.set_reuse_addr(true); LOG_INFO("Signal server runs on port [{}]", port); @@ -105,7 +105,7 @@ void SignalServer::run(uint16_t port) { server_.run(); } -void SignalServer::send_msg(websocketpp::connection_hdl hdl, json message) { +void SignalServer::SendMsg(websocketpp::connection_hdl hdl, json message) { if (!hdl.expired()) { server_.send(hdl, message.dump(), websocketpp::frame::opcode::text); } else { @@ -113,8 +113,8 @@ void SignalServer::send_msg(websocketpp::connection_hdl hdl, json message) { } } -void SignalServer::on_message(websocketpp::connection_hdl hdl, - server::message_ptr msg) { +void SignalServer::OnMessage(websocketpp::connection_hdl hdl, + server::message_ptr msg) { if (transmission_manager_) { transmission_manager_->UpdateWsHandleLastActiveTime(hdl); } diff --git a/src/signal_server.h b/src/signal_server.h index 77a34b8..6ef971d 100644 --- a/src/signal_server.h +++ b/src/signal_server.h @@ -28,16 +28,16 @@ class SignalServer { SignalServer(); ~SignalServer(); - bool on_open(websocketpp::connection_hdl hdl); - bool on_close(websocketpp::connection_hdl hdl); - bool on_fail(websocketpp::connection_hdl hdl); - context_ptr on_tls_init(websocketpp::connection_hdl hdl); - bool on_ping(websocketpp::connection_hdl hdl, std::string s); - bool on_pong(websocketpp::connection_hdl hdl, std::string s); + bool OnOpen(websocketpp::connection_hdl hdl); + bool OnClose(websocketpp::connection_hdl hdl); + bool OnFail(websocketpp::connection_hdl hdl); + context_ptr OnTlsInit(websocketpp::connection_hdl hdl); + bool OnPing(websocketpp::connection_hdl hdl, std::string s); + bool OnPong(websocketpp::connection_hdl hdl, std::string s); - void run(uint16_t port); - void send_msg(websocketpp::connection_hdl hdl, json message); - void on_message(websocketpp::connection_hdl hdl, server::message_ptr msg); + void Run(uint16_t port); + void SendMsg(websocketpp::connection_hdl hdl, json message); + void OnMessage(websocketpp::connection_hdl hdl, server::message_ptr msg); private: server server_; diff --git a/xmake.lua b/xmake.lua index 0162d0e..8cb0ca9 100644 --- a/xmake.lua +++ b/xmake.lua @@ -26,9 +26,8 @@ add_packages("spdlog", "websocketpp", "openssl", "sqlite3", "asio", "nlohmann_js includes("thirdparty") target("log") - set_kind("headeronly") - add_packages("spdlog") - add_headerfiles("src/log/log.h") + set_kind("object") + add_files("src/log/log.cpp") add_includedirs("src/log", {public = true}) target("common")