diff --git a/include/spdlog/details/registry-inl.h b/include/spdlog/details/registry-inl.h index 272bebbd..81fbdec9 100644 --- a/include/spdlog/details/registry-inl.h +++ b/include/spdlog/details/registry-inl.h @@ -13,8 +13,11 @@ #include #ifndef SPDLOG_DISABLE_DEFAULT_LOGGER + // Include emscripten sink on emscripten builds + #if defined(__EMSCRIPTEN__) + #include // support for the default stdout color logger - #ifdef _WIN32 + #elif defined(_WIN32) #include #else #include @@ -33,8 +36,10 @@ namespace details { SPDLOG_INLINE registry::registry() : formatter_(new pattern_formatter()) { #ifndef SPDLOG_DISABLE_DEFAULT_LOGGER - // create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows). - #ifdef _WIN32 + // create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows, or emscripten_sink_mt on emscripten). + #if defined(__EMSCRIPTEN__) + auto color_sink = std::make_shared(); + #elif defined(_WIN32) auto color_sink = std::make_shared(); #else auto color_sink = std::make_shared(); diff --git a/include/spdlog/sinks/emscripten_sink.h b/include/spdlog/sinks/emscripten_sink.h new file mode 100644 index 00000000..d75b9855 --- /dev/null +++ b/include/spdlog/sinks/emscripten_sink.h @@ -0,0 +1,69 @@ +#pragma once + +#ifdef __EMSCRIPTEN__ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +namespace spdlog { +namespace sinks { + +/* + * Emscripten sink + * (logging using emscripten_log) + */ + +template +class emscripten_sink : public base_sink +{ + void sink_it_(const details::log_msg& msg) override + { + // log_msg is a struct containing the log entry info like level, timestamp, thread id etc. + // msg.payload (before v1.3.0: msg.raw) contains pre formatted log + + // If needed (very likely but not mandatory), the sink formats the message before sending it to its final destination: + memory_buf_t formatted; + base_sink::formatter_->format(msg, formatted); + emscripten_log(EM_LOG_CONSOLE | convert_to_emscripten_(msg.level), "%s", fmt::to_string(formatted).c_str()); + } + + void flush_() override {} + +private: + static int convert_to_emscripten_(spdlog::level::level_enum level) { + switch (level) { + case spdlog::level::trace: + case spdlog::level::debug: + return EM_LOG_DEBUG; + case spdlog::level::info: + return EM_LOG_INFO; + case spdlog::level::warn: + return EM_LOG_WARN; + case spdlog::level::err: + case spdlog::level::critical: + return EM_LOG_ERROR; + default: + return 0; + } + } +}; + +using emscripten_sink_mt = emscripten_sink; +using emscripten_sink_st = emscripten_sink; + +} // namespace sinks + +} // namespace spdlog + +#endif // __EMSCRIPTEN__