27#include <fmt/format.h>
43using miosix::ConditionVariable;
44using miosix::FastMutex;
49#ifndef DEFAULT_STDOUT_LOG_LEVEL
50#define DEFAULT_STDOUT_LOG_LEVEL 0
53static constexpr unsigned int ASYNC_LOG_BUFFER_SIZE = 100;
61 : parent(logging), name(name)
67 template <
typename... Args>
68 void log(uint8_t level,
const string& function,
const string& file,
69 int line,
string format, Args&&... args)
71 vlog(level, function, file, line, format,
72 fmt::make_args_checked<Args...>(format, args...));
75 template <
typename... Args>
76 void logAsync(uint8_t level,
const string& function,
const string& file,
77 int line,
string format, Args&&... args)
79 vlogAsync(level, function, file, line, format,
80 fmt::make_args_checked<Args...>(format, args...));
84 void vlog(uint8_t level,
const string& function,
const string& file,
85 int line, fmt::string_view format, fmt::format_args args);
86 void vlogAsync(uint8_t level,
const string& function,
const string& file,
87 int line, fmt::string_view format, fmt::format_args args);
89 LogRecord buildLogRecord(uint8_t level,
const string& function,
90 const string& file,
int line,
91 fmt::string_view format, fmt::format_args args);
124 explicit AsyncLogger(
Logging& parent);
132 CircularBuffer<LogRecord, ASYNC_LOG_BUFFER_SIZE> records;
134 ConditionVariable cv;
137 Logging() : asyncLog(*this)
139 unique_ptr<FileLogSink> serial = std::make_unique<FileLogSink>(stdout);
144 sinks.push_back(std::move(serial));
147 AsyncLogger asyncLog;
148 vector<unique_ptr<LogSink>> sinks;
153#define LOG(logger, level, ...) \
154 logger.log(level, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
156#define LOG_DEBUG(logger, ...) \
157 LOG(logger, Boardcore::LogLevel::LOGL_DEBUG, __VA_ARGS__)
159#define LOG_INFO(logger, ...) \
160 LOG(logger, Boardcore::LogLevel::LOGL_INFO, __VA_ARGS__)
162#define LOG_WARN(logger, ...) \
163 LOG(logger, Boardcore::LogLevel::LOGL_WARNING, __VA_ARGS__)
165#define LOG_ERR(logger, ...) \
166 LOG(logger, Boardcore::LogLevel::LOGL_ERROR, __VA_ARGS__)
168#define LOG_CRIT(logger, ...) \
169 LOG(logger, Boardcore::LogLevel::LOGL_CRITICAL, __VA_ARGS__)
171#define LOG_ASYNC(logger, level, ...) \
172 logger.logAsync(level, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
174#define LOG_DEBUG_ASYNC(logger, ...) \
175 LOG_ASYNC(logger, Boardcore::LogLevel::LOGL_DEBUG, __VA_ARGS__)
177#define LOG_INFO_ASYNC(logger, ...) \
178 LOG_ASYNC(logger, Boardcore::LogLevel::LOGL_INFO, __VA_ARGS__)
180#define LOG_WARN_ASYNC(logger, ...) \
181 LOG_ASYNC(logger, Boardcore::LogLevel::LOGL_WARNING, __VA_ARGS__)
183#define LOG_ERR_ASYNC(logger, ...) \
184 LOG_ASYNC(logger, Boardcore::LogLevel::LOGL_ERROR, __VA_ARGS__)
186#define LOG_CRIT_ASYNC(logger, ...) \
187 LOG_ASYNC(logger, Boardcore::LogLevel::LOGL_CRITICAL, __VA_ARGS__)
#define DEFAULT_STDOUT_LOG_LEVEL
static void startAsyncLogger()
static PrintLogger getLogger(const string &name)
static void addLogSink(unique_ptr< LogSink > &sink)
static LogSink & getStdOutLogSink()
void log(uint8_t level, const string &function, const string &file, int line, string format, Args &&... args)
PrintLogger(Logging &logging, const string &name)
PrintLogger getChild(const string &name)
void logAsync(uint8_t level, const string &function, const string &file, int line, string format, Args &&... args)
static Logging & getInstance()
This file includes all the types the logdecoder script will decode.