Go to the documentation of this file.
9 #ifndef EAGINE_LOGGING_LOGGER_HPP
10 #define EAGINE_LOGGING_LOGGER_HPP
12 #include "../tagged_quantity.hpp"
18 class logger_shared_backend_getter {
19 using This = logger_shared_backend_getter;
22 logger_shared_backend_getter() noexcept = default;
23 logger_shared_backend_getter(This&&) noexcept = default;
24 logger_shared_backend_getter(const This&) noexcept = default;
25 auto operator=(This&&) = delete;
26 auto operator=(const This&) = delete;
28 ~logger_shared_backend_getter() noexcept = default;
30 logger_shared_backend_getter(
31 std::shared_ptr<logger_backend> backend) noexcept
32 : _backend{std::move(backend)} {}
34 auto operator()() noexcept -> logger_backend* {
35 return _backend.get();
39 std::shared_ptr<logger_backend> _backend{};
44 template <
typename BackendGetter>
50 template <log_event_severity severity>
56 return _backend_getter()();
72 basic_logger() noexcept = default;
74 basic_logger(BackendGetter backend_getter) noexcept(
75 std::is_nothrow_move_constructible_v<BackendGetter>)
76 : BackendGetter(std::move(backend_getter)) {}
98 _entry_backend(source, severity)};
101 constexpr
auto make_log_entry(
109 template <log_event_severity severity>
110 constexpr
auto make_log_entry(
112 log_event_severity_constant<severity>,
114 return make_log_entry(
115 source, severity, is_log_level_enabled_t<severity>{},
format);
127 _entry_backend(source, severity)};
131 return make_log_entry(
133 log_event_severity_constant<log_event_severity::fatal>{},
138 return make_log_entry(
140 log_event_severity_constant<log_event_severity::error>{},
145 return make_log_entry(
147 log_event_severity_constant<log_event_severity::warning>{},
152 return make_log_entry(
154 log_event_severity_constant<log_event_severity::info>{},
159 return make_log_entry(
161 log_event_severity_constant<log_event_severity::stat>{},
166 return make_log_entry(
168 log_event_severity_constant<log_event_severity::debug>{},
173 return make_log_entry(
175 log_event_severity_constant<log_event_severity::trace>{},
180 return make_log_entry(
182 log_event_severity_constant<log_event_severity::backtrace>{},
188 return log_info(source,
format);
192 -> stream_log_entry {
194 source,
instance_id(), severity, _entry_backend(source, severity)};
197 void log_chart_sample(
200 float value) noexcept {
201 EAGINE_MAYBE_UNUSED(source);
202 EAGINE_MAYBE_UNUSED(series);
203 EAGINE_MAYBE_UNUSED(value);
204 if constexpr(is_log_level_enabled_v<log_event_severity::stat>) {
216 return lbe->entry_backend(source, severity);
223 auto _backend_getter() noexcept -> BackendGetter& {
234 template <
typename BackendGetter>
242 template <log_event_severity severity>
246 using base::log_lifetime;
251 :
base(BackendGetter(std::move(backend_getter)))
253 log_lifetime(_object_id,
"${self} created with ${backend} backend")
262 :
base(
static_cast<const base&
>(parent))
264 log_lifetime(_object_id,
"created as a child of ${parent}")
274 , _object_id{temp._object_id} {
275 log_lifetime(_object_id,
"being moved");
280 :
base(
static_cast<const base&
>(that))
281 , _object_id{that._object_id} {
282 log_lifetime(_object_id,
"being copied");
294 log_lifetime(_object_id,
"being destroyed");
306 base::set_description(_object_id, display_name, description);
312 return base::log_fatal(_object_id,
format);
318 return base::log_error(_object_id,
format);
324 return base::log_warning(_object_id,
format);
330 return base::log_info(_object_id,
format);
336 return base::log_stat(_object_id,
format);
342 return base::log_debug(_object_id,
format);
348 return base::log_trace(_object_id,
format);
354 return base::log_backtrace(_object_id,
format);
374 base::log_chart_sample(_object_id, series, value);
379 template <
typename T,
typename U>
389 template <
typename T,
typename P>
394 base::log_chart_sample(
395 _object_id, series,
float(
extract(opt_value)));
401 template <log_event_severity severity>
406 return base::make_log_entry(_object_id, tag, level,
format);
411 return base::make_log_entry(_object_id, severity,
format);
415 return base::make_log_stream(_object_id, severity);
442 template <log_event_severity severity>
446 return make_log_entry(level,
format);
460 return make_log_entry(severity,
format);
484 template <
typename T,
typename U>
487 -> std::enable_if_t<std::is_convertible_v<T, float>,
logger&> {
493 template <
typename T,
typename P>
564 #endif // EAGINE_LOGGING_LOGGER_HPP
auto log_debug(string_view format) noexcept
Create a log message entry for debugging, with specified format.
Definition: logger.hpp:341
auto debug(string_view format) noexcept
Returns a debugging log entry.
Definition: logger.hpp:541
basic_string_span< const char > string_view
Alias for const string views.
Definition: string_span.hpp:116
#define EAGINE_ID(NAME)
Macro for constructing instances of eagine::identifier.
Definition: identifier.hpp:353
auto log_warning(string_view format) noexcept
Create a log message entry for warning, with specified format.
Definition: logger.hpp:323
Basic template for logging objects.
Definition: logger.hpp:235
auto debug_stream() noexcept
Returns a log entry stream for debug messages.
Definition: logger.hpp:466
auto fatal(string_view format) noexcept
Returns a fatal error log entry.
Definition: logger.hpp:506
Common code is placed in this namespace.
Definition: eagine.hpp:21
auto instance_id() const noexcept -> logger_instance_id
Returns the unique id of this logger instance.
Definition: logger.hpp:60
auto chart_sample(identifier series, const tagged_quantity< T, U > &qty) noexcept -> std::enable_if_t< std::is_convertible_v< T, float >, logger & >
Stores a new value in the specified chart data series.
Definition: logger.hpp:486
std::uintptr_t logger_instance_id
Logger object instance id type.
Definition: backend.hpp:56
Class for reading application configuration.
Definition: application_config.hpp:29
named_logging_object(identifier id, BackendGetter backend_getter) noexcept
Constructor from identifier and backend_getter object.
Definition: logger.hpp:250
auto chart_sample(identifier series, const valid_if< T, P > &opt_value) noexcept -> logger &
Stores a new value in the specified chart data series.
Definition: logger.hpp:495
static constexpr auto extract(api_result_value< Result, api_result_validity::never > &) noexcept -> Result &
Overload of extract for api_result_value.
Definition: c_api_wrap.hpp:270
auto log_trace(string_view format) noexcept
Create a log message entry for tracing, with specified format.
Definition: logger.hpp:347
auto log_chart_sample(identifier series, float value) noexcept -> named_logging_object &
Stores a new value in the specified chart data series.
Definition: logger.hpp:372
static constexpr auto is_log_level_enabled(log_event_severity severity) noexcept -> bool
Function indicating if the specified log severity is enabled.
Definition: config.hpp:59
auto operator=(named_logging_object &&) noexcept -> named_logging_object &=default
Move assignment operator.
named_logging_object(const named_logging_object &that) noexcept
Copy constructor.
Definition: logger.hpp:279
@ error
Error log entries, indicating serious problems.
named_logging_object() noexcept=default
Construct logging object without backend.
auto log_stat(string_view format) noexcept
Create a log message entry for statistic, with specified format.
Definition: logger.hpp:335
auto log_info(string_view format) noexcept
Create a log message entry for information, with specified format.
Definition: logger.hpp:329
auto log_debug_stream() noexcept
Returns a log entry stream for debug messages.
Definition: logger.hpp:360
auto error_stream() noexcept
Returns a log entry stream for error messages.
Definition: logger.hpp:473
static auto format(std::string &&fmt_str) noexcept -> format_string_and_list< 0 >
Function taking a format string, returning an object for variable specification.
Definition: str_format.hpp:118
auto info(string_view format) noexcept
Returns an informational log entry.
Definition: logger.hpp:527
auto backend() noexcept
Returns a pointer to the backend of this logger object.
Definition: logger.hpp:55
@ debug
Debug log entries.
auto log_fatal(string_view format) noexcept
Create a log message entry for fatal error, with specified format.
Definition: logger.hpp:311
auto trace(string_view format) noexcept
Returns a tracing log entry.
Definition: logger.hpp:548
Do-nothing variant of log_entry with compatible API.
Definition: entry.hpp:606
auto error(string_view format) noexcept
Returns an error log entry.
Definition: logger.hpp:513
std::integral_constant< log_event_severity, severity > log_event_severity_constant
Type alias for log event severity constants.
Definition: config.hpp:34
std::conditional_t< is_log_level_enabled_v< severity >, log_entry, no_log_entry > entry_type
The entry type for the specified log_event_severity.
Definition: logger.hpp:52
named_logging_object(identifier id, const named_logging_object &parent) noexcept
Constructor from logger id and parent logging object.
Definition: logger.hpp:259
auto chart_sample(identifier series, float value) noexcept -> logger &
Stores a new value in the specified chart data series.
Definition: logger.hpp:478
void object_description(string_view display_name, string_view description) noexcept
Sets the human-readable name and description of this object.
Definition: logger.hpp:303
log_event_severity
Log event severity enumeration.
Definition: severity.hpp:18
constexpr auto object_id() const noexcept
Returns the identifier of this logging object.
Definition: logger.hpp:298
constexpr auto value() const noexcept -> T
Returns the value.
Definition: tagged_quantity.hpp:69
auto log_backtrace(string_view format) noexcept
Create a log message entry for backtracing, with specified format.
Definition: logger.hpp:353
auto log_chart_sample(identifier series, const tagged_quantity< T, U > &qty) noexcept -> std::enable_if_t< std::is_convertible_v< T, float >, named_logging_object & >
Stores a new value in the specified chart data series.
Definition: logger.hpp:380
Class representing a single log entry / message.
Definition: entry.hpp:67
auto stat(string_view format) noexcept
Returns a statistic log entry.
Definition: logger.hpp:534
auto log_error_stream() noexcept
Returns a log entry stream for error messages.
Definition: logger.hpp:367
auto log_chart_sample(identifier series, const valid_if< T, P > &opt_value) noexcept -> named_logging_object &
Stores a new value in the specified chart data series.
Definition: logger.hpp:390
auto log(log_event_severity severity, string_view format) noexcept
Returns a log entry with the specified log_event_severity.
Definition: logger.hpp:459
@ stat
Statistic log entries.
auto log(log_event_severity_constant< severity > level, string_view format) noexcept -> entry_type< severity >
Returns a log entry with the specified log_event_severity level.
Definition: logger.hpp:443
Standalone logger object type.
Definition: logger.hpp:427
auto warning(string_view format) noexcept
Returns a warning log entry.
Definition: logger.hpp:520
Value of type T with a specified unit or tag type U.
Definition: tagged_quantity.hpp:27
auto backtrace(string_view format) noexcept
Returns a backtracing log entry.
Definition: logger.hpp:555
basic_identifier< 10, 6, default_identifier_char_set, identifier_t > identifier
Default identifier type used throughout the project.
Definition: identifier.hpp:346
auto log_error(string_view format) noexcept
Create a log message entry for error, with specified format.
Definition: logger.hpp:317
Basic template for logger objects.
Definition: logger.hpp:45