debug nothrow log calls

This commit is contained in:
2018-10-02 19:13:05 +07:00
parent 93f49f90fd
commit 88068f8de3
2 changed files with 30 additions and 18 deletions

View File

@@ -41,19 +41,19 @@ namespace e2d
level min_level() const noexcept;
template < typename... Args >
debug& log(level lvl, str_view fmt, Args&&... args);
debug& log(level lvl, str_view fmt, Args&&... args) noexcept;
template < typename... Args >
debug& trace(str_view fmt, Args&&... args);
debug& trace(str_view fmt, Args&&... args) noexcept;
template < typename... Args >
debug& warning(str_view fmt, Args&&... args);
debug& warning(str_view fmt, Args&&... args) noexcept;
template < typename... Args >
debug& error(str_view fmt, Args&&... args);
debug& error(str_view fmt, Args&&... args) noexcept;
template < typename... Args >
debug& fatal(str_view fmt, Args&&... args);
debug& fatal(str_view fmt, Args&&... args) noexcept;
private:
mutable std::mutex mutex_;
vector<std::pair<level, sink_uptr>> sinks_;
@@ -78,7 +78,9 @@ namespace e2d
{
template < typename T, typename... Args >
T& debug::register_sink(Args&&... args) {
return register_sink_ex<T>(level::trace, std::forward<Args>(args)...);
return register_sink_ex<T>(
level::trace,
std::forward<Args>(args)...);
}
template < typename T, typename... Args >
@@ -89,13 +91,22 @@ namespace e2d
}
template < typename... Args >
debug& debug::log(level lvl, str_view fmt, Args&&... args) {
debug& debug::log(level lvl, str_view fmt, Args&&... args) noexcept {
std::lock_guard<std::mutex> guard(mutex_);
if ( lvl >= min_level_ && !sinks_.empty() ) {
str text = strings::rformat(fmt, std::forward<Args>(args)...);
str formatted_text;
try {
formatted_text = strings::rformat(
fmt, std::forward<Args>(args)...);
} catch (...) {
E2D_ASSERT_MSG(false, "DEBUG: ignored log formatting exception");
return *this;
}
for ( const auto& pair : sinks_ ) {
if ( lvl >= pair.first && pair.second ) {
pair.second->on_message(lvl, text);
bool success = pair.second->on_message(lvl, formatted_text);
E2D_UNUSED(success);
E2D_ASSERT_MSG(success, "DEBUG: ignored failed log sink call");
}
}
}
@@ -103,22 +114,22 @@ namespace e2d
}
template < typename... Args >
debug& debug::trace(str_view fmt, Args&&... args) {
debug& debug::trace(str_view fmt, Args&&... args) noexcept {
return log(level::trace, fmt, std::forward<Args>(args)...);
}
template < typename... Args >
debug& debug::warning(str_view fmt, Args&&... args) {
debug& debug::warning(str_view fmt, Args&&... args) noexcept {
return log(level::warning, fmt, std::forward<Args>(args)...);
}
template < typename... Args >
debug& debug::error(str_view fmt, Args&&... args) {
debug& debug::error(str_view fmt, Args&&... args) noexcept {
return log(level::error, fmt, std::forward<Args>(args)...);
}
template < typename... Args >
debug& debug::fatal(str_view fmt, Args&&... args) {
debug& debug::fatal(str_view fmt, Args&&... args) noexcept {
return log(level::fatal, fmt, std::forward<Args>(args)...);
}
}

View File

@@ -72,15 +72,16 @@ namespace e2d
debug_file_sink::debug_file_sink(str_view path)
: path_(path) {
make_write_file(path, false);
const auto file = make_write_file(path, false);
E2D_UNUSED(file);
E2D_ASSERT_MSG(file, "DEBUG: ignored failed sink file cleaning");
}
bool debug_file_sink::on_message(debug::level lvl, str_view text) noexcept {
try {
auto file = make_write_file(path_, true);
str log_text = log_text_format(lvl, text);
const auto file = make_write_file(path_, true);
return file && output_sequence(*file)
.write(log_text.c_str(), log_text.length())
.write_all(log_text_format(lvl, text))
.success();
} catch (...) {
return false;
@@ -93,7 +94,7 @@ namespace e2d
bool debug_console_sink::on_message(debug::level lvl, str_view text) noexcept {
try {
str log_text = log_text_format(lvl, text);
const str log_text = log_text_format(lvl, text);
const std::ptrdiff_t rprintf = std::printf("%s", log_text.c_str());
return rprintf >= 0
&& math::numeric_cast<std::size_t>(rprintf) == log_text.length();