#pragma once #include #include #include #include #include #include #include #include #include "centiseconds.h" enum class LogLevel { Trace, Debug, Info, Warning, Error, Fatal, EndSentinel }; std::string toString(LogLevel level); template std::basic_ostream& operator<< (std::basic_ostream& stream, LogLevel level) { return stream << toString(level); } using LoggerType = boost::log::sources::severity_logger_mt; BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(globalLogger, LoggerType) #define LOG(level) \ BOOST_LOG_STREAM_WITH_PARAMS(globalLogger::get(), (::boost::log::keywords::severity = level)) #define LOG_TRACE LOG(LogLevel::Trace) #define LOG_DEBUG LOG(LogLevel::Debug) #define LOG_INFO LOG(LogLevel::Info) #define LOG_WARNING LOG(LogLevel::Warning) #define LOG_ERROR LOG(LogLevel::Error) #define LOG_FATAL LOG(LogLevel::Fatal) class PausableBackendAdapter : public boost::log::sinks::basic_formatted_sink_backend { public: PausableBackendAdapter(boost::shared_ptr backend); void consume(const boost::log::record_view& recordView, const std::string message); void pause(); void resume(); private: boost::shared_ptr backend; std::vector> buffer; std::mutex mutex; bool isPaused = false; }; boost::shared_ptr initLogging(); void logTimedEvent(const std::string& eventName, centiseconds start, centiseconds end, const std::string& value);