From 5c199cda60006ef1c04ccabe7479ce6ba1a738b0 Mon Sep 17 00:00:00 2001 From: Galarius Date: Sun, 25 Feb 2024 16:15:28 +0200 Subject: [PATCH] Add oslogger spd sink for macOS --- CMakeLists.txt | 5 +++ include/oslogger.hpp | 72 ++++++++++++++++++++++++++++++++++++++++++++ src/log.cpp | 21 ++++++++----- 3 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 include/oslogger.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a99092..9873473 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,11 @@ set(sources main.cpp utils.cpp ) + +if(APPLE) + set(headers ${headers} oslogger.hpp) +endif() + list(TRANSFORM headers PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/include/") list(TRANSFORM sources PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/src/") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/version.hpp.in version.hpp) diff --git a/include/oslogger.hpp b/include/oslogger.hpp new file mode 100644 index 0000000..5caab4f --- /dev/null +++ b/include/oslogger.hpp @@ -0,0 +1,72 @@ +// +// oslogger.hpp +// opencl-language-server +// +// Created by Ilia Shoshin on 24/02/24. +// + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace ocls { + +template +class oslogger_sink : public spdlog::sinks::base_sink +{ +protected: + void sink_it_(const spdlog::details::log_msg& msg) override + { + spdlog::memory_buf_t formatted; + spdlog::sinks::base_sink::formatter_->format(msg, formatted); + const std::string message = fmt::to_string(formatted); + const std::string category(msg.logger_name.begin(), msg.logger_name.end()); + + /* + * From + * + * The logging runtime maintains a global collection of all os_log_t + * objects, one per subsystem/category pair. The os_log_t for a given + * subsystem/category is created upon the first call to os_log_create and + * any subsequent calls return the same object. These objects are never + * deallocated, so dynamic creation (e.g. on a per-operation basis) is + * generally inappropriate. + * + * A value will always be returned to allow for dynamic enablement. + */ + const os_log_t log = os_log_create("com.galarius.vscode-opencl.server", category.c_str()); + + switch (msg.level) + { + case spdlog::level::trace: + case spdlog::level::debug: + os_log_debug(log, "%{public}s", message.c_str()); + break; + case spdlog::level::info: + case spdlog::level::warn: + os_log_info(log, "%{public}s", message.c_str()); + break; + case spdlog::level::err: + os_log_error(log, "%{public}s", message.c_str()); + break; + case spdlog::level::critical: + os_log_fault(log, "%{public}s", message.c_str()); + break; + default: + os_log(log, "%{public}s", message.c_str()); + break; + } + } + + void flush_() override {} +}; + +using oslogger_sink_mt = oslogger_sink; +using oslogger_sink_st = oslogger_sink; + +} // namespace ocls diff --git a/src/log.cpp b/src/log.cpp index d822f6b..b8e95b8 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -6,6 +6,7 @@ // #include "log.hpp" +#include "oslogger.hpp" #include "utils.hpp" #include @@ -26,23 +27,27 @@ void ConfigureLogging(bool fileLogging, const std::string& filename, spdlog::lev { try { - spdlog::sink_ptr sink; + std::vector sinks; if (fileLogging) { - sink = std::make_shared(filename); + sinks.push_back(std::make_shared(filename)); } else { - sink = std::make_shared(); + sinks.push_back(std::make_shared()); } +#if defined(__APPLE__) + sinks.push_back(std::make_shared()); +#endif - spdlog::set_default_logger(std::make_shared(LogName::main, sink)); + spdlog::set_default_logger(std::make_shared(LogName::main, sinks.begin(), sinks.end())); spdlog::set_level(level); std::vector> subLoggers = { - std::make_shared(LogName::clinfo, sink), - std::make_shared(LogName::diagnostics, sink), - std::make_shared(LogName::jrpc, sink), - std::make_shared(LogName::lsp, sink)}; + std::make_shared(LogName::clinfo, sinks.begin(), sinks.end()), + std::make_shared(LogName::diagnostics, sinks.begin(), sinks.end()), + std::make_shared(LogName::jrpc, sinks.begin(), sinks.end()), + std::make_shared(LogName::lsp, sinks.begin(), sinks.end()) + }; for (const auto& logger : subLoggers) {