Search code examples
c++jsonboostc++17nlohmann-json

How to pass boost::log::expressions::smessage to nlohmann::json constructor?


I have a code similar to this:
const auto jsonFormatter = boost::log::expressions::stream << boost::log::expressions::smessage;

I want to escape the message using nlohmann::json, something like:
nlohmann::json json{boost::log::expressions::smessage};

I can do following to convert boost::log::expressions::smessage to std::string:

std::stringstream ss;
ss << boost::log::expressions::smessage;
std::string message = ss.str();
nlohmann::json json{message};

, but I need to put it inside the formatter, because the
const auto jsonFormatter = boost::log::expressions::stream << nlohmann::json{boost::log::expressions::smessage}; can't convert the boost::log::expressions::smessage argument to any nlohmann::json constructor.

Any suggestions how to make it work?


Solution

  • I really appreciate help and the other answers, which may be better in other cases, but long story short, I tried a lot of solutions and went with this one in the end (I can update it if it can be improved):

    #include <boost/phoenix/bind/bind_function.hpp>
    ..
    nlohmann::json EscapeMessage(
        boost::log::value_ref<std::string, boost::log::expressions::tag::smessage> const& message)
    {
        return message ? nlohmann::json(message.get()) : nlohmann::json();
    }
    ..
    const auto jsonFormatter = boost::log::expressions::stream << boost::phoenix::bind(&EscapeMessage, boost::log::expressions::smessage.or_none())
    boost::log::add_console_log(std::cout, boost::log::keywords::format = jsonFormatter);