55#define UNUSED(x) (x=x)
57#define LOG_LEVEL_QUIET 0
58#define LOG_LEVEL_FATAL 1
59#define LOG_LEVEL_ERROR 2
60#define LOG_LEVEL_WARNING 3
61#define LOG_LEVEL_NOTICE 4
62#define LOG_LEVEL_INFO 5
63#define LOG_LEVEL_VERBOSE 6
65#define LOG_LEVEL_DEBUG 7
67#define LOG_LEVEL_DEBUG2 8
69#define LOG_LEVEL_MAX LOG_LEVEL_DEBUG2
84void debug_file_dump(
const char *
key,
void (*serialize)(
const void *data, FILE *),
void *data);
86#define debug_file_dump(key, serialize, data) (void) (key), (void) (serialize), (void) (data)
89#define error_msg(...) log_msg(LOG_LEVEL_ERROR, __VA_ARGS__)
90#define verbose_msg(...) log_msg(LOG_LEVEL_VERBOSE, __VA_ARGS__)
92#define debug_msg(...) log_msg(LOG_LEVEL_DEBUG, __VA_ARGS__)
96#define MSG(l, fmt, ...) \
97 log_msg(LOG_LEVEL_##l, "%s" fmt, MOD_NAME, ##__VA_ARGS__)
101 bool *logger_skip_repeats,
110#define CUMULATIVE_REPORTS_INTERVAL 30
120#include <string_view>
135 void reserve(
size_t size){
if(
get().capacity() < size)
get().reserve(size); }
195 static std::string empty =
"";
224 static constexpr int ts_bufsize = 32;
225 char ts_str[ts_bufsize];
232 snprintf(ts_str, ts_bufsize,
"[%.3f] ",
236 const char *start_newline =
"";
237 std::lock_guard<std::mutex>
lock(
mut);
247 start_newline =
"\n";
258 std::lock_guard<std::mutex>
lock(
mut);
280 std::string
msg =
oss.str();
285 msg.size() > 0 &&
msg.at(
msg.size() - 1) ==
'\n';
287 msg.resize(
msg.size() - 1);
302 inline std::ostream&
Get() {
314if ((level) <= log_level) Logger(level).Get()
320#define DEBUG_TIMER_EVENT(name) time_ns_t name = get_time_in_ns()
321#define DEBUG_TIMER_START(name) DEBUG_TIMER_EVENT(name##_start);
322#define DEBUG_TIMER_STOP(name) DEBUG_TIMER_EVENT(name##_stop); log_msg(LOG_LEVEL_DEBUG2, "%s duration: %lf s\n", #name, (name##_stop - name##_start) / NS_IN_SEC_DBL)
324#define DEBUG_TIMER_START(name)
325#define DEBUG_TIMER_STOP(name)
Buffer & operator=(Buffer &&)=delete
void append(std::string_view sv)
void append(int count, char c)
Buffer(const Buffer &)=delete
void reserve(size_t size)
Buffer & operator=(const Buffer &)=delete
const std::string & get_level_style(int lvl)
Log_output(Log_output &&)=delete
log_timestamp_mode show_timestamps
void set_skip_repeats(bool val)
std::atomic< bool > skip_repeated
Log_output(const Log_output &)=delete
bool get_skip_repeats() const
static constexpr int initial_buf_size
bool is_interactive() const
std::string & get_internal_buffer()
Log_output & operator=(Log_output &&)=delete
Log_output & operator=(const Log_output &)=delete
void set_timestamp_mode(log_timestamp_mode val)
friend void log_msg_once(int level, uint32_t id, const char *msg,...)
string prune_ansi_sequences_str(const char *in)
void debug_dump(const void *lp, int len)
#define LOG_LEVEL_NOTICE
information that may be interesting
void bug_msg(int level, const char *format,...) __attribute__((format(printf
bool parse_log_cfg(const char *conf_str, int *log_lvl, bool *logger_skip_repeats, enum log_timestamp_mode *show_timestamps)
#define debug_file_dump(key, serialize, data)
#define LOG_LEVEL_ERROR
general errors
#define LOG_LEVEL_VERBOSE
void log_msg(int log_level, const char *format,...) __attribute__((format(printf
void void log_msg_once(int log_level, uint32_t id, const char *msg,...) __attribute__((format(printf
#define LOG_LEVEL_FATAL
errors that prevent UG run
Log_output & get_log_output()
void void void log_perror(int log_level, const char *msg)
#define LOG_LEVEL_WARNING
less severe errors
static time_ns_t get_time_in_ns()