42 #define FMT_HEADER_ONLY
43 #pragma GCC diagnostic push
44 #pragma GCC diagnostic ignored "-Wshadow"
45 #include <spdlog/sinks/base_sink.h>
46 #include <spdlog/spdlog.h>
47 #pragma GCC diagnostic pop
52 #define STRINGISTRINGIFY(x) #x
53 #define STRINGIFY(x) STRINGISTRINGIFY(x)
56 #define LOG_CHANNEL(channel) LogManager::get_instance()->get_channel(channel)
70 #define log_info(channel, ...) LOG_CHANNEL(channel)->info(__VA_ARGS__)
72 #define log_trace(channel, ...) LOG_CHANNEL(channel)->trace("[" __FILE__ ":" STRINGIFY(__LINE__) "] " __VA_ARGS__)
74 #define log_debug(channel, ...) LOG_CHANNEL(channel)->debug("[" __FILE__ ":" STRINGIFY(__LINE__) "] " __VA_ARGS__)
76 #define log_warning(channel, ...) LOG_CHANNEL(channel)->warn("[" __FILE__ ":" STRINGIFY(__LINE__) "] " __VA_ARGS__)
78 #define log_error(channel, ...) LOG_CHANNEL(channel)->error("[" __FILE__ ":" STRINGIFY(__LINE__) "] " __VA_ARGS__)
80 #define log_critical(channel, ...) LOG_CHANNEL(channel)->critical("[" __FILE__ ":" STRINGIFY(__LINE__) "] " __VA_ARGS__)
94 #define die(channel, ...) \
97 LOG_CHANNEL(channel)->critical("[" __FILE__ ":" STRINGIFY(__LINE__) "] " __VA_ARGS__); \
124 static LogManager* get_instance(
const std::filesystem::path& file_name =
"");
132 void set_file_name(
const std::filesystem::path& file_name);
140 void set_format_pattern(
const std::string& format);
149 std::shared_ptr<spdlog::logger> get_channel(
const std::string& channel_name =
"stdout");
156 std::set<std::string> get_channels()
const;
166 std::shared_ptr<spdlog::logger> add_channel(
const std::string& channel_name,
const std::vector<std::shared_ptr<log_sink>>& sinks,
const std::string& level =
"info");
173 void remove_channel(
const std::string& channel_name);
181 std::string get_level_of_channel(
const std::string& channel_name)
const;
189 void set_level_of_channel(
const std::string& channel_name,
const std::string& level);
196 std::set<std::string> get_available_log_levels()
const;
204 void activate_channel(
const std::string& channel_name);
209 void activate_all_channels();
216 void deactivate_channel(
const std::string& channel_name);
221 void deactivate_all_channels();
228 CallbackHook<void(
const spdlog::level::level_enum&,
const std::string&,
const std::string&)>& get_gui_callback();
249 std::vector<std::shared_ptr<hal::LogManager::log_sink>> get_default_sinks();
256 void remove_sink_from_default(
const std::string& sink_type);
264 static std::shared_ptr<log_sink> create_stdout_sink(
const bool colored =
true);
275 static std::shared_ptr<log_sink> create_file_sink(
const std::filesystem::path& file_name =
"",
const bool truncate =
false);
282 static std::shared_ptr<log_sink> create_gui_sink();
285 static std::map<std::string, std::shared_ptr<log_sink>> m_file_sinks;
288 LogManager(
const std::filesystem::path& file_name);
299 std::filesystem::path m_file_path;
301 std::map<std::string, spdlog::level::level_enum> m_level;
303 std::map<std::string, std::shared_ptr<spdlog::logger>> m_logger;
305 std::map<std::string, std::vector<std::shared_ptr<log_sink>>> m_logger_sinks;
307 CallbackHook<void(
const spdlog::level::level_enum&,
const std::string&,
const std::string&)> m_gui_callback;
311 std::string m_enforce_level;
313 std::vector<std::shared_ptr<hal::LogManager::log_sink>> m_default_sinks;
328 void sink_it_(
const spdlog::details::log_msg& msg)
override;
void sink_it_(const spdlog::details::log_msg &msg) override
std::filesystem::path path
std::shared_ptr< spdlog::sinks::sink > spdlog_sink