mirror of
https://github.com/enduro2d/enduro2d.git
synced 2026-01-04 17:21:01 +07:00
debug nothrow log calls
This commit is contained in:
@@ -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)...);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user