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; level min_level() const noexcept;
template < typename... Args > 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 > template < typename... Args >
debug& trace(str_view fmt, Args&&... args); debug& trace(str_view fmt, Args&&... args) noexcept;
template < typename... Args > template < typename... Args >
debug& warning(str_view fmt, Args&&... args); debug& warning(str_view fmt, Args&&... args) noexcept;
template < typename... Args > template < typename... Args >
debug& error(str_view fmt, Args&&... args); debug& error(str_view fmt, Args&&... args) noexcept;
template < typename... Args > template < typename... Args >
debug& fatal(str_view fmt, Args&&... args); debug& fatal(str_view fmt, Args&&... args) noexcept;
private: private:
mutable std::mutex mutex_; mutable std::mutex mutex_;
vector<std::pair<level, sink_uptr>> sinks_; vector<std::pair<level, sink_uptr>> sinks_;
@@ -78,7 +78,9 @@ namespace e2d
{ {
template < typename T, typename... Args > template < typename T, typename... Args >
T& debug::register_sink(Args&&... 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 > template < typename T, typename... Args >
@@ -89,13 +91,22 @@ namespace e2d
} }
template < typename... Args > 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_); std::lock_guard<std::mutex> guard(mutex_);
if ( lvl >= min_level_ && !sinks_.empty() ) { 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_ ) { for ( const auto& pair : sinks_ ) {
if ( lvl >= pair.first && pair.second ) { 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 > 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)...); return log(level::trace, fmt, std::forward<Args>(args)...);
} }
template < typename... 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)...); return log(level::warning, fmt, std::forward<Args>(args)...);
} }
template < typename... 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)...); return log(level::error, fmt, std::forward<Args>(args)...);
} }
template < typename... 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)...); 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) debug_file_sink::debug_file_sink(str_view path)
: path_(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 { bool debug_file_sink::on_message(debug::level lvl, str_view text) noexcept {
try { try {
auto file = make_write_file(path_, true); const auto file = make_write_file(path_, true);
str log_text = log_text_format(lvl, text);
return file && output_sequence(*file) return file && output_sequence(*file)
.write(log_text.c_str(), log_text.length()) .write_all(log_text_format(lvl, text))
.success(); .success();
} catch (...) { } catch (...) {
return false; return false;
@@ -93,7 +94,7 @@ namespace e2d
bool debug_console_sink::on_message(debug::level lvl, str_view text) noexcept { bool debug_console_sink::on_message(debug::level lvl, str_view text) noexcept {
try { 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()); const std::ptrdiff_t rprintf = std::printf("%s", log_text.c_str());
return rprintf >= 0 return rprintf >= 0
&& math::numeric_cast<std::size_t>(rprintf) == log_text.length(); && math::numeric_cast<std::size_t>(rprintf) == log_text.length();