Sélectionner une révision Git
Log.cc 6,70 Kio
#include "Log.hh"
// Vivy::LogLevel utility implementation
namespace Vivy
{
const std::string_view
LogLevel::toStdStringView(const LogLevel::Level lvl) noexcept
{
return LevelsStringViews[static_cast<Array::size_type>(lvl)];
}
}
// Vivy::LogSinkDispatcher and child classes implementation
namespace Vivy
{
LogSinkDispatcher::~LogSinkDispatcher() noexcept {}
const std::string_view
StderrLogSinkDispatcher::trunkFileName(const char *fileName) noexcept
{
using size_type = std::string_view::size_type;
static constexpr char basePrefix[] = "/src/";
static constexpr size_type basePrefixLen = (sizeof(basePrefix) / sizeof(char)) - 1;
const std::string_view fileNameView{ fileName };
const size_type basePath = fileNameView.rfind(basePrefix);
return std::string_view{ fileNameView.data() + basePath + basePrefixLen,
fileNameView.data() + fileNameView.size() };
}
std::string
StderrLogSinkDispatcher::reduceFileName(const std::string_view fileName) noexcept
{
return std::filesystem::path(fileName).lexically_normal();
}
StderrLogSinkDispatcher::StderrLogSinkDispatcher() noexcept
: LogSinkDispatcher(std::string_view{ "stderr" })
{
}
void
StderrLogSinkDispatcher::handleLogMessage(const std::string_view category,
const LogMessage &msg) noexcept
{
std::cerr << "#(" << reduceFileName(trunkFileName(msg.getHeader().fileName)) << " +"
<< msg.getHeader().lineNumberInFile << " | "
<< LogLevel::toStdStringView(msg.getHeader().severity) << " -> " << category << ") "
<< msg.getTextBuffer() << '\n';
}
}
// Vivy::LogSink implementation
namespace Vivy
{
// Flush all messages before exiting
LogSink::~LogSink() noexcept { flush(); }
// Get the log message from the logger and add it to the sink's queue.
void
LogSink::recieveLogMessage(const Logger *const logger, LogMessage &&msg) noexcept
{
const std::lock_guard<std::mutex> messageQueueLockGuard(messageQueueLock);
messageQueue.emplace_back(std::make_tuple<const std::string_view, LogMessage>(
logger->getCategoryView(), std::move(msg.sink())));
}
// Flush all LogMessages to all of the LogSinkDispatchers. Also clear the message queue.
void