Libs/Common/Logging.h
Namespaces
Name |
---|
shapeworks User usage reporting (telemetry) |
Classes
Name | |
---|---|
struct | fmt::formatter< QString > |
class | shapeworks::Logging ShapeWorks Logging Library. |
Functions
Name | |
---|---|
template <typename... Args> std::string |
safe_format(const std::string & fmt_str, const Args &... args) |
Defines
Name | |
---|---|
SW_LOG_STACK(message) Log stack macro. |
|
SW_LOG(message, ...) Log message macro. |
|
SW_WARN(message, ...) Log warning macro. |
|
SW_ERROR(message, ...) Log error macro. |
|
SW_DEBUG(message, ...) Log debug macro. |
|
SW_TRACE(x) Variable trace macro (e.g. output variable name = |
|
SW_MESSAGE(message, ...) Log show message macro. |
|
SW_STATUS(message, ...) Don't write to log, but set status (e.g. in the Studio statusbar) |
|
SW_PROGRESS(value, message, ...) | |
SW_CLOSE_LOG() Close session macro. |
|
SW_LOG_ONCE(message, ...) Log once macro, will only log the message once. |
Functions Documentation
function safe_format
template <typename... Args>
std::string safe_format(
const std::string & fmt_str,
const Args &... args
)
Macros Documentation
define SW_LOG_STACK
#define SW_LOG_STACK(
message
)
shapeworks::Logging::Instance().log_stack(message)
Log stack macro.
define SW_LOG
#define SW_LOG(
message,
...
)
shapeworks::Logging::Instance().log_message(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__);
Log message macro.
define SW_WARN
#define SW_WARN(
message,
...
)
shapeworks::Logging::Instance().log_warning(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
Log warning macro.
define SW_ERROR
#define SW_ERROR(
message,
...
)
shapeworks::Logging::Instance().log_error(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
Log error macro.
define SW_DEBUG
#define SW_DEBUG(
message,
...
)
shapeworks::Logging::Instance().log_debug(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__, __FUNCTION__)
Log debug macro.
define SW_TRACE
#define SW_TRACE(
x
)
SW_DEBUG(#x " = {}", x);
Variable trace macro (e.g. output variable name =
define SW_MESSAGE
#define SW_MESSAGE(
message,
...
)
shapeworks::Logging::Instance().show_message(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
Log show message macro.
define SW_STATUS
#define SW_STATUS(
message,
...
)
shapeworks::Logging::Instance().show_status(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
Don't write to log, but set status (e.g. in the Studio statusbar)
define SW_PROGRESS
#define SW_PROGRESS(
value,
message,
...
)
shapeworks::Logging::Instance().show_progress(value, safe_format(message, ##__VA_ARGS__));
define SW_CLOSE_LOG
#define SW_CLOSE_LOG(
)
shapeworks::Logging::Instance().close_log();
Close session macro.
define SW_LOG_ONCE
#define SW_LOG_ONCE(
message,
...
)
{ \
static bool logged = false; \
if (!logged) { \
SW_LOG(message, ##__VA_ARGS__); \
logged = true; \
} \
}
Log once macro, will only log the message once.
Source code
#pragma once
#include <spdlog/fmt/fmt.h>
#include <QString>
#include <functional>
#include <iostream>
template <>
struct fmt::formatter<QString> {
constexpr auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { return ctx.end(); }
template <typename FormatContext>
auto format(const QString& str, FormatContext& ctx) const -> decltype(ctx.out()) {
return fmt::format_to(ctx.out(), "{}", qUtf8Printable(str));
}
};
template <typename... Args>
std::string safe_format(const std::string& fmt_str, const Args&... args) {
std::string result;
try {
result = fmt::format(fmt_str, args...);
} catch (const std::exception& e) {
// Handle formatting errors here, example:
std::cerr << "Error formatting string: " << fmt_str << " : " << e.what() << std::endl;
}
return result;
}
namespace shapeworks {
class Logging {
public:
static Logging& Instance();
void open_file_log(const std::string& filename);
bool check_log_open() const;
std::string get_log_filename() const;
void log_message(const std::string& message, const int line, const char* file) const;
void log_stack(const std::string& message) const;
void log_error(const std::string& message, const int line, const char* file) const;
void show_message(const std::string& message, const int line, const char* file) const;
void show_status(const std::string& message, const int line, const char* file) const;
void show_progress(double value, const std::string& message);
void log_debug(const std::string& message, const int line, const char* file, const char* function) const;
void log_warning(const std::string& message, const int line, const char* file) const;
void close_log();
void set_error_callback(const std::function<void(std::string)>& callback);
void set_message_callback(const std::function<void(std::string)>& callback);
void set_warning_callback(const std::function<void(std::string)>& callback);
void set_debug_callback(const std::function<void(std::string)>& callback);
void set_status_callback(const std::function<void(std::string)>& callback);
void set_progress_callback(const std::function<void(double, std::string)>& callback);
private:
Logging();
std::string log_filename_;
bool log_open_ = false;
std::function<void(std::string)> error_callback_;
std::function<void(std::string)> message_callback_;
std::function<void(std::string)> warning_callback_;
std::function<void(std::string)> debug_callback_;
std::function<void(std::string)> status_callback_;
std::function<void(double, std::string)> progress_callback_;
};
#define SW_LOG_STACK(message) shapeworks::Logging::Instance().log_stack(message)
#define SW_LOG(message, ...) \
shapeworks::Logging::Instance().log_message(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__);
#define SW_WARN(message, ...) \
shapeworks::Logging::Instance().log_warning(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
#define SW_ERROR(message, ...) \
shapeworks::Logging::Instance().log_error(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
#define SW_DEBUG(message, ...) \
shapeworks::Logging::Instance().log_debug(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__, __FUNCTION__)
#define SW_TRACE(x) SW_DEBUG(#x " = {}", x);
#define SW_MESSAGE(message, ...) \
shapeworks::Logging::Instance().show_message(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
#define SW_STATUS(message, ...) \
shapeworks::Logging::Instance().show_status(safe_format(message, ##__VA_ARGS__), __LINE__, __FILE__)
#define SW_PROGRESS(value, message, ...) \
shapeworks::Logging::Instance().show_progress(value, safe_format(message, ##__VA_ARGS__));
#define SW_CLOSE_LOG() shapeworks::Logging::Instance().close_log();
#define SW_LOG_ONCE(message, ...) \
{ \
static bool logged = false; \
if (!logged) { \
SW_LOG(message, ##__VA_ARGS__); \
logged = true; \
} \
}
} // namespace shapeworks
Updated on 2024-03-17 at 12:58:44 -0600