+22
-13
@@ -7,6 +7,7 @@
|
||||
#include <utility>
|
||||
#include <modulus/types.hpp>
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
auto is_valid_log_level(modulus::log_level level) noexcept -> std::bool_t {
|
||||
@@ -19,13 +20,13 @@ auto should_log(modulus::log_level record_level, modulus::log_level configured_l
|
||||
return configured_level != modulus::log_level::OFF && static_cast<std::int32_t>(record_level) >= static_cast<std::int32_t>(configured_level);
|
||||
}
|
||||
|
||||
auto format_log_record(std::ostream& stream, const modulus::log_record& record) -> void {
|
||||
auto format_log_record(std::ostream &stream, const modulus::log_record &record) -> void {
|
||||
assert(is_valid_log_level(record.level));
|
||||
assert(record.location.file_name() != nullptr);
|
||||
stream << '[' << modulus::to_string(record.level) << "] " << record.message << " (" << record.location.file_name() << ':' << record.location.line() << ")\n";
|
||||
}
|
||||
|
||||
auto stderr_sink(const modulus::log_record& record) -> void {
|
||||
auto stderr_sink(const modulus::log_record &record) -> void {
|
||||
assert(is_valid_log_level(record.level));
|
||||
assert(record.location.file_name() != nullptr);
|
||||
static auto mutex = std::mutex{};
|
||||
@@ -38,18 +39,26 @@ auto stderr_sink(const modulus::log_record& record) -> void {
|
||||
auto modulus::to_string(modulus::log_level level) noexcept -> std::string_view {
|
||||
assert(is_valid_log_level(level));
|
||||
switch (level) {
|
||||
case modulus::log_level::TRACE: return "trace";
|
||||
case modulus::log_level::DEBUG: return "debug";
|
||||
case modulus::log_level::INFO: return "info";
|
||||
case modulus::log_level::WARN: return "warn";
|
||||
case modulus::log_level::ERROR: return "error";
|
||||
case modulus::log_level::CRITICAL: return "critical";
|
||||
case modulus::log_level::OFF: return "off";
|
||||
case modulus::log_level::TRACE:
|
||||
return "trace";
|
||||
case modulus::log_level::DEBUG:
|
||||
return "debug";
|
||||
case modulus::log_level::INFO:
|
||||
return "info";
|
||||
case modulus::log_level::WARN:
|
||||
return "warn";
|
||||
case modulus::log_level::ERROR:
|
||||
return "error";
|
||||
case modulus::log_level::CRITICAL:
|
||||
return "critical";
|
||||
case modulus::log_level::OFF:
|
||||
return "off";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
modulus::logger::logger() : sink_(stderr_sink) {}
|
||||
modulus::logger::logger()
|
||||
: sink_(stderr_sink) {}
|
||||
|
||||
auto modulus::logger::set_level(modulus::log_level level) -> void {
|
||||
assert(is_valid_log_level(level));
|
||||
@@ -69,7 +78,7 @@ auto modulus::logger::enabled(modulus::log_level level) const -> std::bool_t {
|
||||
return should_log(level, level_) && static_cast<std::bool_t>(sink_);
|
||||
}
|
||||
|
||||
auto modulus::logger::set_sink(std::function<void(const modulus::log_record&)> sink) -> void {
|
||||
auto modulus::logger::set_sink(std::function<void(const modulus::log_record &)> sink) -> void {
|
||||
auto lock = std::lock_guard{mutex_};
|
||||
sink_ = std::move(sink);
|
||||
}
|
||||
@@ -78,7 +87,7 @@ auto modulus::logger::write(modulus::log_record record) const -> void {
|
||||
assert(is_valid_log_level(record.level));
|
||||
assert(record.location.file_name() != nullptr);
|
||||
assert(record.location.function_name() != nullptr);
|
||||
auto sink = std::function<void(const modulus::log_record&)>{};
|
||||
auto sink = std::function<void(const modulus::log_record &)>{};
|
||||
{
|
||||
auto lock = std::lock_guard{mutex_};
|
||||
if (!should_log(record.level, level_) || !sink_) {
|
||||
@@ -102,7 +111,7 @@ auto modulus::logger::log(modulus::log_level level, std::string message, modulus
|
||||
});
|
||||
}
|
||||
|
||||
auto modulus::default_logger() -> modulus::logger& {
|
||||
auto modulus::default_logger() -> modulus::logger & {
|
||||
static auto instance = modulus::logger{};
|
||||
return instance;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user