mirror of
https://github.com/kunkundi/crossdesk-server.git
synced 2026-03-22 15:47:55 +08:00
[feat] use argv to set log path
This commit is contained in:
62
src/log/log.cpp
Normal file
62
src/log/log.cpp
Normal 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;
|
||||
}
|
||||
122
src/log/log.h
122
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 <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
|
||||
26
src/main.cpp
26
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 <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
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user