| @@ -8,12 +8,15 @@ | |||
| #include <boost/leaf/handle_exception.hpp> | |||
| #include <fmt/ostream.h> | |||
| #include <neo/event.hpp> | |||
| #include <filesystem> | |||
| #include <iostream> | |||
| int main_fn(std::string_view program_name, const std::vector<std::string>& argv) { | |||
| dds::log::init_logger(); | |||
| auto log_subscr = neo::subscribe(&dds::log::ev_log::print); | |||
| dds::install_signal_handlers(); | |||
| dds::cli::options opts; | |||
| @@ -97,7 +97,7 @@ struct http_client_impl { | |||
| .parse_tail = {}, | |||
| }; | |||
| dds_log(trace, | |||
| dds_log(debug, | |||
| " --> HTTP {} {}://{}:{}{}", | |||
| params.method, | |||
| origin.protocol, | |||
| @@ -154,7 +154,7 @@ struct http_client_impl { | |||
| disconnect = true; | |||
| } | |||
| _peer_disconnected = disconnect; | |||
| dds_log(trace, " <-- HTTP {} {}", r.status, r.status_message); | |||
| dds_log(debug, " <-- HTTP {} {}", r.status, r.status_message); | |||
| return r; | |||
| } | |||
| }; | |||
| @@ -229,10 +229,16 @@ http_client http_pool::client_for_origin(const network_origin& origin) { | |||
| ret._pool = _impl; | |||
| if (iter == _impl->_clients.end()) { | |||
| // Nothing for this origin yet | |||
| dds_log(debug, "Opening new connection to {}://{}:{}", origin.protocol, origin.hostname, origin.port); | |||
| auto ptr = std::make_shared<detail::http_client_impl>(origin); | |||
| ptr->connect(); | |||
| ret._impl = ptr; | |||
| } else { | |||
| dds_log(debug, | |||
| "Reusing existing connection to {}://{}:{}", | |||
| origin.protocol, | |||
| origin.hostname, | |||
| origin.port); | |||
| ret._impl = iter->second; | |||
| _impl->_clients.erase(iter); | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| #include "./log.hpp" | |||
| #include <neo/assert.hpp> | |||
| #include <neo/event.hpp> | |||
| #include <spdlog/spdlog.h> | |||
| @@ -23,6 +24,8 @@ void dds::log::init_logger() noexcept { | |||
| spdlog::set_pattern("[%^%-5l%$] %v"); | |||
| } | |||
| void dds::log::ev_log::print() const noexcept { log_print(level, message); } | |||
| void dds::log::log_print(dds::log::level l, std::string_view msg) noexcept { | |||
| static auto logger_inst = [] { | |||
| auto logger = spdlog::default_logger_raw(); | |||
| @@ -51,5 +54,18 @@ void dds::log::log_print(dds::log::level l, std::string_view msg) noexcept { | |||
| neo_assert_always(invariant, false, "Invalid log level", msg, int(l)); | |||
| }(); | |||
| logger_inst->log(lvl, "{}", msg); | |||
| logger_inst->log(lvl, msg); | |||
| } | |||
| void dds::log::log_emit(dds::log::ev_log ev) noexcept { | |||
| if (!neo::get_event_subscriber<ev_log>()) { | |||
| thread_local bool did_warn = false; | |||
| if (!did_warn) { | |||
| log_print(level::warn, | |||
| "The calling thread issued a log message, but there is no subscriber " | |||
| "listening for it. The log message will be dropped. This is a bug!"); | |||
| did_warn = true; | |||
| } | |||
| } | |||
| neo::emit(ev); | |||
| } | |||
| @@ -18,7 +18,15 @@ enum class level : int { | |||
| inline level current_log_level = level::info; | |||
| struct ev_log { | |||
| log::level level; | |||
| std::string_view message; | |||
| void print() const noexcept; | |||
| }; | |||
| void log_print(level l, std::string_view s) noexcept; | |||
| void log_emit(ev_log) noexcept; | |||
| void init_logger() noexcept; | |||
| @@ -33,7 +41,7 @@ template <formattable... Args> | |||
| void log(level l, std::string_view s, const Args&... args) noexcept { | |||
| if (int(l) >= int(current_log_level)) { | |||
| auto message = fmt::format(s, args...); | |||
| log_print(l, message); | |||
| log_emit(ev_log{l, message}); | |||
| } | |||
| } | |||
| @@ -1,5 +1,9 @@ | |||
| #pragma once | |||
| #include <dds/util/log.hpp> | |||
| #include <neo/event.hpp> | |||
| #include <algorithm> | |||
| #include <iterator> | |||
| #include <mutex> | |||
| @@ -23,6 +27,8 @@ bool parallel_run(Range&& rng, int n_jobs, Func&& fn) { | |||
| std::vector<std::exception_ptr> exceptions; | |||
| auto run_one = [&]() mutable { | |||
| auto log_subscr = neo::subscribe(&log::ev_log::print); | |||
| while (true) { | |||
| std::unique_lock lk{mut}; | |||
| if (!exceptions.empty()) { | |||