[feat] use argv to set log path

This commit is contained in:
dijunkun
2025-09-08 18:38:20 +08:00
parent 0bd91dc1c2
commit 8b0dd95e2f
6 changed files with 129 additions and 140 deletions

62
src/log/log.cpp Normal file
View File

@@ -0,0 +1,62 @@
#include "log.h"
#include <atomic>
#include <filesystem>
namespace {
std::string g_log_dir = "logs";
std::once_flag g_logger_once_flag;
std::shared_ptr<spdlog::logger> g_logger;
std::atomic<bool> 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<spdlog::logger> 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<spdlog::sink_ptr> sinks;
sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
sinks.push_back(std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
filename, 5 * 1024 * 1024, 3));
g_logger = std::make_shared<spdlog::logger>(LOGGER_NAME, sinks.begin(),
sinks.end());
g_logger->flush_on(spdlog::level::info);
spdlog::register_logger(g_logger);
});
return g_logger;
}

View File

@@ -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 <chrono>
#include <iomanip>
#include <iostream>
#include <memory>
#include <mutex>
#include <sstream>
#include <string>
#include <vector>
#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<spdlog::sink_ptr> sinks; \
sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>()); \
sinks.push_back(std::make_shared<spdlog::sinks::rotating_file_sink_mt>( \
path, 1048576 * 5, 3)); \
auto combined_logger = std::make_shared<spdlog::logger>( \
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<spdlog::logger> 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<spdlog::sink_ptr> sinks; \
sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>()); \
sinks.push_back(std::make_shared<spdlog::sinks::rotating_file_sink_mt>( \
path, 1048576 * 5, 3)); \
auto combined_logger = std::make_shared<spdlog::logger>( \
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<spdlog::sink_ptr> sinks; \
sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>()); \
sinks.push_back(std::make_shared<spdlog::sinks::rotating_file_sink_mt>( \
path, 1048576 * 5, 3)); \
auto combined_logger = std::make_shared<spdlog::logger>( \
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<spdlog::sink_ptr> sinks; \
sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>()); \
sinks.push_back(std::make_shared<spdlog::sinks::rotating_file_sink_mt>( \
path, 1048576 * 5, 3)); \
auto combined_logger = std::make_shared<spdlog::logger>( \
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

View File

@@ -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 <iostream>
#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;
}
}
#endif

View File

@@ -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<TransmissionManager>();
signal_negotiation_ =
std::make_unique<SignalNegotiation>(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>(
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);
}

View File

@@ -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_;

View File

@@ -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")