Skip to content

Commit e99d46e

Browse files
committed
Migrate logging from spdlog to slick_logger
- Replace spdlog with slick_logger via FetchContent for better integration - Update slick_queue handling and remove obsolete cmake/slick_queue.cmake - Enhance Windows shared memory security with session-isolated names - Bump version to 1.1.0.0 and update CHANGELOG, README.md, and build files - Refactor includes and dependencies in source files for consistency
1 parent 08e5dfe commit e99d46e

File tree

13 files changed

+186
-161
lines changed

13 files changed

+186
-161
lines changed

CHANGELOG

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
1.1.0.0 - [8/29/2025]
2+
- Replace spdlog with slick_logger via FetchContent for better integration
3+
- Update slick_queue handling and remove obsolete cmake/slick_queue.cmake
4+
- Enhance Windows shared memory security with session-isolated names
5+
- Bump version to 1.1.0.0 and update CHANGELOG, README.md, and build files
6+
- Refactor includes and dependencies in source files for consistency
7+
18
1.0.0.3
29
- Rotate log file
310

CMakeLists.txt

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,34 +23,40 @@ if (CMAKE_BUILD_TYPE MATCHES Release)
2323
endif()
2424

2525
set(Boost_USE_STATIC_LIBS ON)
26-
find_package(Boost REQUIRED COMPONENTS beast context)
26+
find_package(Boost CONFIG REQUIRED COMPONENTS beast context)
2727

2828
set(OPENSSL_USE_STATIC_LIBS TRUE)
2929
set(OPENSSL_MSVC_STATIC_RT TRUE)
3030
find_package(OpenSSL REQUIRED)
3131

32-
find_package(spdlog REQUIRED CONFIG)
33-
add_definitions(-DSPDLOG_USE_STD_FORMAT -DSPDLOG_USE_STD_FORMAT_HO)
34-
35-
include(cmake/slick_queue.cmake)
32+
include(FetchContent)
33+
# Disable examples, tests, and benchmarks for slick_logger
34+
set(BUILD_SLICK_LOGGER_EXAMPLES OFF CACHE BOOL "" FORCE)
35+
set(BUILD_SLICK_LOGGER_TESTING OFF CACHE BOOL "" FORCE)
36+
set(BUILD_SLICK_LOGGER_BENCHMARKS OFF CACHE BOOL "" FORCE)
37+
FetchContent_Declare(
38+
slick_logger
39+
GIT_REPOSITORY https://github.com/SlickTech/slick_logger.git
40+
GIT_TAG main
41+
)
42+
FetchContent_MakeAvailable(slick_logger)
3643

44+
message(STATUS "Slick Queue: ${slick_queue_SOURCE_DIR}")
45+
message(STATUS "Slick Logger: ${slick_logger_SOURCE_DIR}")
3746
message(STATUS "OpenSSL: ${OPENSSL_INCLUDE_DIR}")
3847
message(STATUS "Beast: ${boost_beast_CONFIG}")
39-
message(STATUS "spdlog: ${spdlog_CONFIG}")
4048

4149
set(RELEASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/dist")
4250
configure_file(src/version.h.in dist/include/websocket_proxy/version.h)
4351

4452
set(SOURCES
45-
# src/pch.cpp
4653
src/main.cpp
4754
src/websocket_proxy.cpp
4855
)
4956

5057
add_executable(websocket_proxy ${SOURCES})
51-
target_include_directories(websocket_proxy PUBLIC include ${slick_queue_SOURCE_DIR}/include ${RELEASE_DIR}/include)
52-
target_link_libraries(websocket_proxy PRIVATE spdlog::spdlog_header_only Boost::asio Boost::beast Boost::context OpenSSL::SSL OpenSSL::Crypto)
53-
target_link_libraries(websocket_proxy PRIVATE ${VCPKG_ROOT})
58+
target_include_directories(websocket_proxy PUBLIC include ${RELEASE_DIR}/include)
59+
target_link_libraries(websocket_proxy PRIVATE slick_queue slick_logger Boost::asio Boost::beast Boost::context OpenSSL::SSL OpenSSL::Crypto)
5460
# target_precompile_headers(websocket_proxy PRIVATE "src/pch.hpp")
5561

5662
if (MSVC)
@@ -65,7 +71,7 @@ if (MSVC)
6571
target_compile_options(websocket_proxy PRIVATE "/bigobj")
6672
set_target_properties(websocket_proxy PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
6773
else()
68-
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
74+
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -flto")
6975
endif()
7076

7177
if (CMAKE_BUILD_TYPE MATCHES Release)
@@ -80,4 +86,10 @@ if (CMAKE_BUILD_TYPE MATCHES Release)
8086
)
8187
endif()
8288

83-
add_subdirectory(example EXLCUDE_FROM_ALL)
89+
option(BUILD_EXAMPLE "Build example" ON)
90+
if(BUILD_EXAMPLE)
91+
message(STATUS "Building example")
92+
add_subdirectory(example)
93+
else()
94+
message(STATUS "Skipping example")
95+
endif()

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ WebsocketProxy relies on several external libraries. You can install these depen
3333

3434
2. **Install Required Libraries**:
3535
```sh
36-
./vcpkg install spdlog:x64-windows-static
3736
./vcpkg install boost-beast:x64-windows-static
3837
./vcpkg install openssl:x64-windows-static
3938
```

cmake/slick_queue.cmake

Lines changed: 0 additions & 4 deletions
This file was deleted.

include/websocket_proxy/types.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1818
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1919
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20-
// SOFTWARE.#pragma once
20+
// SOFTWARE.
2121

2222
#pragma once
2323

24-
#include "slick_queue.h"
24+
#include <slick_queue/slick_queue.h>
2525
#include <atomic>
2626
#include <chrono>
2727

@@ -38,7 +38,7 @@ namespace websocket_proxy {
3838
#pragma pack(1)
3939
struct Message {
4040
enum Type : uint8_t {
41-
Regster,
41+
Register,
4242
Unregister,
4343
OpenWs,
4444
CloseWs,
@@ -48,6 +48,7 @@ struct Message {
4848
WsError,
4949
Subscribe,
5050
Unsubscribe,
51+
LogLevel,
5152
};
5253

5354
enum Status : uint8_t {
@@ -117,6 +118,21 @@ struct WsData {
117118
uint32_t remaining;
118119
char data[0];
119120
};
121+
122+
struct LogLevel {
123+
enum level_enum : uint8_t {
124+
trace = 0,
125+
debug = 1,
126+
info = 2,
127+
warn = 3,
128+
err = 4,
129+
critical = 5,
130+
off = 6,
131+
n_levels
132+
};
133+
134+
level_enum level;
135+
};
120136
#pragma pack()
121137
#pragma warning( pop )
122138

include/websocket_proxy/websocket_proxy_client.h

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,13 @@ class WebsocketProxyClient {
6767
bool closeWebSocket(uint64_t id = 0);
6868
bool subscribe(uint64_t id, const std::string& symbol, const char* subscription_request, uint32_t request_len, SubscriptionType type, bool& existing);
6969
bool unsubscribe(uint64_t id, const std::string& symbol, const char* unsubscription_request, uint32_t request_len);
70+
bool setLogLevel(LogLevel::level_enum level);
7071
void send(uint64_t id, const char* msg, uint32_t len);
7172

7273
private:
7374
bool connect();
7475
bool spawnWebsocketsProxyServer();
75-
void waitForServerReady();
76+
bool waitForServerReady();
7677
bool _register();
7778
void unregister();
7879
void sendMessage(Message* msg, uint64_t index, uint32_t size);
@@ -192,8 +193,12 @@ inline bool WebsocketProxyClient::connect() {
192193
return false;
193194
}
194195

195-
waitForServerReady();
196-
return _register();
196+
if (server_queue_index_ != 0 || waitForServerReady())
197+
{
198+
return _register();
199+
}
200+
callback_->logError([]() { return "Failed to connect to websocket proxy server"; });
201+
return false;
197202
}
198203

199204
inline void WebsocketProxyClient::sendMessage(Message* msg, uint64_t index, uint32_t size) {
@@ -247,7 +252,8 @@ inline bool WebsocketProxyClient::spawnWebsocketsProxyServer() {
247252
server_queue_ = std::make_unique<SHM_QUEUE_T>(SERVER_TO_CLIENT_QUEUE);
248253
break;
249254
}
250-
catch (const std::runtime_error&) {
255+
catch (const std::runtime_error &e) {
256+
callback_->logError([&e]() { return e.what(); });
251257
std::this_thread::sleep_for(std::chrono::seconds(1));
252258
}
253259
}
@@ -269,22 +275,24 @@ inline bool WebsocketProxyClient::spawnWebsocketsProxyServer() {
269275
return true;
270276
}
271277

272-
inline void WebsocketProxyClient::waitForServerReady()
278+
inline bool WebsocketProxyClient::waitForServerReady()
273279
{
274280
auto start = get_timestamp();
275281
while ((get_timestamp() - start) < 10000) {
276282
auto result = server_queue_->read(server_queue_index_);
277283
if (result.first) {
278-
break;
284+
return true;
279285
}
280286
}
287+
return false;
281288
}
282289

283290
inline bool WebsocketProxyClient::_register() {
284291
auto [msg, index, size] = reserveMessage<RegisterMessage>();
285-
msg->type = Message::Type::Regster;
292+
msg->type = Message::Type::Register;
286293
auto reg = reinterpret_cast<RegisterMessage*>(msg->data);
287-
strcpy_s(reg->name, 32, name_.c_str());
294+
strcpy_s(reg->name, 31, name_.c_str());
295+
reg->name[31] = 0;
288296
sendMessage(msg, index, size);
289297
if (!waitForResponse(msg, 20000)) {
290298
callback_->logError([]() { return "Unable to connect to websocket_proxy. timeout"; });
@@ -402,6 +410,15 @@ inline bool WebsocketProxyClient::unsubscribe(uint64_t id, const std::string& sy
402410
return true;
403411
}
404412

413+
inline bool WebsocketProxyClient::setLogLevel(LogLevel::level_enum level) {
414+
auto [msg, index, size] = reserveMessage<LogLevel>();
415+
msg->type = Message::Type::LogLevel;
416+
auto req = reinterpret_cast<LogLevel*>(msg->data);
417+
req->level = level;
418+
sendMessage(msg, index, size);
419+
return true;
420+
}
421+
405422
inline void WebsocketProxyClient::send(uint64_t id, const char* data, uint32_t len) {
406423
auto [msg, index, size] = reserveMessage<WsRequest>(len);
407424
msg->type = Message::Type::WsRequest;

src/main.cpp

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121

2222
#include "pch.hpp"
2323

24-
#ifdef DEBUG
25-
#include <spdlog/sinks/stdout_color_sinks.h>
26-
#endif
2724
#include "websocket_proxy.h"
2825
#include <websocket_proxy/version.h>
2926
#include <csignal>
@@ -33,11 +30,7 @@
3330
#endif
3431

3532
using namespace websocket_proxy;
36-
37-
void atexit_hanlder()
38-
{
39-
spdlog::shutdown();
40-
}
33+
using namespace slick_logger;
4134

4235
/**
4336
* Usage:
@@ -50,20 +43,19 @@ void atexit_hanlder()
5043
*/
5144
int main(int argc, char* argv[])
5245
{
53-
std::atexit(atexit_hanlder);
54-
spdlog::init_thread_pool(8192, 1);
46+
Logger::instance().clear_sinks();
47+
LogConfig config;
48+
config.queue_size = 65536;
49+
5550
#ifdef DEBUG
56-
auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
57-
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("./log/WebsocketProxy.log");
58-
std::vector<spdlog::sink_ptr> sinks {stdout_sink, file_sink};
59-
auto logger = std::make_shared<spdlog::async_logger>("websocket_proxy_logger", sinks.begin(), sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::overrun_oldest);
60-
spdlog::set_default_logger(logger);
61-
spdlog::flush_on(spdlog::level::trace);
62-
#else
63-
auto async_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("./Log/WebsocketProxy.log", 524288000, 5);
64-
auto async_logger = std::make_shared<spdlog::async_logger>("async_logger", async_sink, spdlog::thread_pool(), spdlog::async_overflow_policy::overrun_oldest);
65-
spdlog::set_default_logger(async_logger);
51+
config.sinks.push_back(std::make_shared<ConsoleSink>(true, true));
52+
config.min_level = slick_logger::LogLevel::L_TRACE;
6653
#endif
54+
// Configure rotation
55+
RotationConfig rotation;
56+
rotation.max_file_size = 200 * 1024 * 1024; // 200MB
57+
rotation.max_files = 10; // keep last 10 files
58+
config.sinks.push_back(std::make_shared<RotatingFileSink>("./Log/WebsocketProxy.log", rotation));
6759

6860
uint32_t server_queue_size = 1 << 24; // 16MB
6961
[[maybe_unused]] bool log_level_set = false;
@@ -73,28 +65,25 @@ int main(int argc, char* argv[])
7365
std::transform(l.begin(), l.end(), l.begin(), [](char c){ return std::tolower(c); });
7466
log_level_set = true;
7567
if (l == "off") {
76-
spdlog::set_level(spdlog::level::off);
68+
config.min_level = slick_logger::LogLevel::L_OFF;
7769
}
7870
else if (l == "critical") {
79-
spdlog::set_level(spdlog::level::critical);
80-
spdlog::flush_on(spdlog::level::critical);
71+
config.min_level = slick_logger::LogLevel::L_FATAL;
8172
}
8273
else if (l == "error") {
83-
spdlog::set_level(spdlog::level::err);
84-
spdlog::flush_on(spdlog::level::err);
74+
config.min_level = slick_logger::LogLevel::L_ERROR;
8575
}
8676
else if (l == "warning") {
87-
spdlog::set_level(spdlog::level::warn);
88-
spdlog::flush_on(spdlog::level::warn);
77+
config.min_level = slick_logger::LogLevel::L_WARN;
8978
}
9079
else if (l == "info") {
91-
spdlog::set_level(spdlog::level::info);
80+
config.min_level = slick_logger::LogLevel::L_INFO;
9281
}
9382
else if (l == "debug") {
94-
spdlog::set_level(spdlog::level::debug);
83+
config.min_level = slick_logger::LogLevel::L_DEBUG;
9584
}
9685
else if (l == "trace") {
97-
spdlog::set_level(spdlog::level::trace);
86+
config.min_level = slick_logger::LogLevel::L_TRACE;
9887
}
9988
else {
10089
log_level_set = false;
@@ -105,18 +94,10 @@ int main(int argc, char* argv[])
10594
}
10695
}
10796

108-
#ifdef DEBUG
109-
if (!log_level_set) {
110-
spdlog::set_level(spdlog::level::trace);
111-
}
112-
#endif
113-
114-
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%F][%t][%l][%s:%#] %v");
115-
spdlog::flush_every(std::chrono::seconds(2));
97+
Logger::instance().init(config);
11698

117-
SPDLOG_INFO(std::format("Start WebsocketProxy {} ...", VERSION));
99+
LOG_INFO(std::format("Start WebsocketProxy {} ...", VERSION));
118100
WebsocketProxy proxy(server_queue_size);
119101
proxy.run();
120-
SPDLOG_INFO("WebsocketProxy Exit.");
121-
spdlog::shutdown();
102+
LOG_INFO("WebsocketProxy Exit.");
122103
}

src/pch.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@
2929
#include <boost/beast/core.hpp>
3030
#include <boost/beast/websocket.hpp>
3131
#include <boost/beast/websocket/ssl.hpp>
32-
#include "spdlog_include.h"
33-
#include <spdlog/async.h>
34-
#include <spdlog/sinks/rotating_file_sink.h>
35-
#include "slick_queue.h"
32+
#include <slick_queue/slick_queue.h>
33+
#include <slick_logger/logger.hpp>
3634

3735
#if defined(_MSC_VER)
3836
#include <windows.h>

src/spdlog_include.h

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)