13 Logger::Severity Logger::defaultSeverityFromEnv() {
14 const auto* envValue = std::getenv(
"CHIMERATK_LOG_LEVEL");
15 if(envValue ==
nullptr) {
21 if(!severity.has_value()) {
22 std::cerr << std::format(
"Warning: CHIMERATK_LOG_LEVEL has invalid value '{}'. {}. Falling back to default.",
23 envValue, severity.error())
33 if(_mainLoopThread.joinable()) {
36 _mainLoopThread.interrupt();
43 _messageQueue.push_exception(std::make_exception_ptr(boost::thread_interrupted()));
44 }
while(!_mainLoopThread.try_join_for(boost::chrono::milliseconds(10)));
46 catch(boost::thread_interrupted&) {
50 catch(std::system_error& e) {
51 std::cerr <<
"std::system_error caught: " << e.what() << std::endl;
55 std::cerr <<
"unknown exception caught." << std::endl;
59 assert(!_mainLoopThread.joinable());
65 return {
this, severity, std::move(context)};
71 : std::ostream(severity >=
logger->_minSeverity ? &_buf : nullptr), _severity(severity), _context(std::move(context)),
78 _logger.log(_severity, std::move(_context), _buf.str());
83 void Logger::log(
Logger::Severity severity, std::string context, std::string message)
noexcept {
85 _messageQueue.push({severity, std::move(context), std::move(message)});
87 catch(std::system_error& e) {
88 std::cerr <<
"std::system_error caught: " << e.what() << std::endl;
95 std::string Logger::severityToString(Severity severity) {
113 void Logger::mainLoop() {
116 _messageQueue.pop_wait(message);
118 auto* stream = &std::cout;
125 auto t = std::time(
nullptr);
126 auto tm = *std::localtime(&t);
127 std::stringstream prefix;
128 prefix.setf(std::ios::left, std::ios::adjustfield);
129 prefix << std::put_time(&tm,
"%Y-%m-%dT%H:%M:%S") <<
" " << std::setw(20) << message.context.substr(0, 20) <<
" ["
130 << severityToString(message.severity) <<
"] ";
133 std::stringstream ss(message.text);
135 while(std::getline(ss, line,
'\n')) {
136 *stream << prefix.str() << line <<
"\n";
138 *stream << std::flush;
Severity levels used by the Logger.
static constexpr std::expected< Logger::Severity, std::string > fromString(const std::string &string)
Set Severity from string.
Proxy for output stream, handed out to the log sources by the Logger::Module.
StreamProxy(Logger *logger, Severity severity, std::string context)
StreamProxy getStream(Severity severity, std::string context)
Return an output stream object for the given severity.
InvalidityTracer application module.
Logger::StreamProxy logger(Logger::Severity severity, std::string context)
Convenience function to obtain the logger stream.