Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
logger.h
1// SPDX-FileCopyrightText: © 2024 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#ifndef __UTILS_LOGGER_H__
5#define __UTILS_LOGGER_H__
6
7#include "zrythm-config.h"
8
9#include "utils/format.h"
10#include "utils/types.h"
11
12#include "juce_wrapper.h"
13#include <spdlog/spdlog.h>
14
15namespace zrythm::utils
16{
17
19{
20public:
21 virtual ~ILogger () = default;
22
23 void init_sinks (bool for_testing);
24
25 std::vector<Utf8String>
26 get_last_log_entries (size_t count, bool formatted) const;
27
34 virtual std::pair<fs::path, fs::path>
35 generate_compresed_file (fs::path &dir, fs::path &path) const = 0;
36
37#ifdef __GNUC__
38# pragma GCC diagnostic push
39# pragma GCC diagnostic ignored "-Wnull-dereference"
40#endif
41 [[nodiscard]] const std::shared_ptr<spdlog::logger> &get_logger () const
42 {
43 return logger_;
44 }
45#ifdef __GNUC__
46# pragma GCC diagnostic pop
47#endif
48
49 virtual bool need_backtrace () const = 0;
50
51 virtual fs::path get_log_file_path () const = 0;
52
53protected:
54 std::shared_ptr<spdlog::logger> logger_;
55
62 double last_bt_time_ = 0;
63};
64
65class Logger : public ILogger
66{
67public:
68 enum class LoggerType
69 {
70 GUI,
71 Engine,
72 };
73
74 Logger (LoggerType type);
75
76 std::pair<fs::path, fs::path>
77 generate_compresed_file (fs::path &dir, fs::path &path) const override;
78
79 bool need_backtrace () const override;
80
81 [[nodiscard]] fs::path get_log_file_path () const override;
82
83private:
84 LoggerType type_{};
85};
86
87class TestLogger : public ILogger
88{
89public:
90 TestLogger ();
91
92 std::pair<fs::path, fs::path>
93 generate_compresed_file (fs::path &dir, fs::path &path) const override;
94
95 bool need_backtrace () const override;
96
97 fs::path get_log_file_path () const override;
98};
99
101{
102public:
103 static void set_logger (std::shared_ptr<ILogger> logger)
104 {
105 instance ().logger_ = std::move (logger);
106 }
107
108 static ILogger &logger ()
109 {
110 auto &logger_provider = instance ();
111 if (!logger_provider.logger_) [[unlikely]]
112 {
113 logger_provider.logger_ = std::make_shared<TestLogger> ();
114 }
115 return *logger_provider.logger_;
116 }
117
118 static bool has_logger () { return instance ().logger_ != nullptr; };
119
120private:
121 static LoggerProvider &instance ()
122 {
123 static LoggerProvider provider;
124 return provider;
125 }
126
127 std::shared_ptr<ILogger> logger_;
128};
129
130#define LOGGER_INSTANCE zrythm::utils::LoggerProvider::logger ().get_logger ()
131#define z_warning(...) SPDLOG_LOGGER_WARN (LOGGER_INSTANCE, __VA_ARGS__)
132#define z_error(...) SPDLOG_LOGGER_ERROR (LOGGER_INSTANCE, __VA_ARGS__)
133#define z_critical(...) SPDLOG_LOGGER_CRITICAL (LOGGER_INSTANCE, __VA_ARGS__)
134#define z_trace(...) SPDLOG_LOGGER_TRACE (LOGGER_INSTANCE, __VA_ARGS__)
135#define z_debug(...) SPDLOG_LOGGER_DEBUG (LOGGER_INSTANCE, __VA_ARGS__)
136#define z_info(...) SPDLOG_LOGGER_INFO (LOGGER_INSTANCE, __VA_ARGS__)
137
141#define z_return_val_if_fail(cond, val) \
142 if (!(cond)) [[unlikely]] \
143 { \
144 z_error (format_str ("Assertion failed: {}", #cond)); \
145 return val; \
146 }
147
151#define z_return_if_fail(cond) z_return_val_if_fail (cond, )
152
156#define z_return_val_if_reached(val) \
157 { \
158 z_error ("This code should not be reached"); \
159 return val; \
160 }
161
165#define z_return_if_reached() z_return_val_if_reached ()
166
167#define z_warn_if_fail(cond) \
168 if (!(cond)) [[unlikely]] \
169 { \
170 z_warning (format_str ("Assertion failed: {}", #cond)); \
171 }
172
173#define z_warn_if_reached() z_warning ("This code should not be reached")
174
175}; // namespace zrythm::utils
176
177#endif
double last_bt_time_
Last timestamp a backtrace was obtained.
Definition logger.h:62
virtual std::pair< fs::path, fs::path > generate_compresed_file(fs::path &dir, fs::path &path) const =0
Generates a compressed log file (for sending with bug reports).
std::pair< fs::path, fs::path > generate_compresed_file(fs::path &dir, fs::path &path) const override
Generates a compressed log file (for sending with bug reports).
std::pair< fs::path, fs::path > generate_compresed_file(fs::path &dir, fs::path &path) const override
Generates a compressed log file (for sending with bug reports).
String utilities.
Definition algorithms.h:12