qxLib
logger.h
Go to the documentation of this file.
1 /**
2 
3  @file logger.h
4  @author Khrapov
5  @date 17.06.2019
6  @copyright © Nick Khrapov, 2021. All right reserved.
7 
8 **/
9 #pragma once
10 
12 #include <qx/patterns/singleton.h>
13 
14 #include <memory>
15 
16 #ifndef QX_LOGGER_INSTANCE
17  #define QX_LOGGER_INSTANCE qx::logger_singleton::get_instance()
18 #endif
19 
20 /**
21  @brief Log with category
22  @param category - category to be used to manage output
23  @param eVerbosity - message verbosity
24  @param format - format string
25  @param ... - additional args for formatting
26 **/
27 #define QX_LOG_C(category, eVerbosity, format, ...) \
28  QX_LOGGER_INSTANCE \
29  .log(eVerbosity, format, category, QX_SHORT_FILE, qx::to_string(__FUNCTION__), QX_LINE, ##__VA_ARGS__)
30 
31 /**
32  @def QX_LOG
33  @brief Log message
34  @param eVerbosity - message verbosity
35  @param format - format string
36  @param ... - additional args for formatting
37 **/
38 #define QX_LOG(eVerbosity, format, ...) QX_LOG_C(CatDefault, eVerbosity, format, ##__VA_ARGS__)
39 
40 namespace qx
41 {
42 
43 template<class... args_t>
44 concept log_acceptable_args = (sizeof...(args_t) > 0 && format_acceptable_args<char_type, args_t...>);
45 
46 /**
47 
48  @class logger
49  @brief Logger class
50  @author Khrapov
51  @date 10.01.2020
52 
53 **/
54 class logger
55 {
56 public:
57  /**
58  @brief Log to all streams
59  @param eVerbosity - message verbosity
60  @param svFormat - format string
61  @param category - code category
62  @param svFile - file name string
63  @param svFunction - function name string
64  @param nLine - code line number
65  **/
66  void log(
67  verbosity eVerbosity,
68  string_view svFormat,
69  const category& category,
70  string_view svFile,
71  string_view svFunction,
72  int nLine);
73 
74  /**
75  @brief Log to all streams
76  @tparam args_t - template parameter pack type
77  @param eVerbosity - message verbosity
78  @param sFormat - format string
79  @param category - code category
80  @param svFile - file name string
81  @param svFunction - function name string
82  @param nLine - code line number
83  @param args - additional args for format
84  **/
85  template<class... args_t>
86  requires(log_acceptable_args<args_t...>)
87  void log(
88  verbosity eVerbosity,
90  const category& category,
91  string_view svFile,
92  string_view svFunction,
93  int nLine,
94  args_t&&... args);
95 
96  /**
97  @brief Flush all streams
98  **/
99  void flush();
100 
101  /**
102  @brief Add output stream to the logger
103  @param pStream - stream unique pointer
104  **/
105  void add_stream(std::unique_ptr<base_logger_stream> pStream) noexcept;
106 
107  /**
108  @brief Reset logger and clear all streams
109  **/
110  void reset() noexcept;
111 
112  /**
113  @brief Returns true if any of streams will accept this message
114  @details Typically you don't want to use it
115  It may be useful with async logging to avoid unnecessary formatting and queueing
116  @param category - code category
117  @param eVerbosity - message verbosity
118  @param svFile - file name string
119  @param svFunction - function name string
120  @retval - true if any of streams will accept this message
121  **/
123  const category& category,
124  verbosity eVerbosity,
125  string_view svFile,
126  string_view svFunction) const noexcept;
127 
128 private:
129  std::vector<std::unique_ptr<base_logger_stream>> m_Streams;
130 };
131 
132 /**
133 
134  @class logger_singleton
135  @brief Default logger instance
136  @author Khrapov
137  @date 19.08.2021
138 
139 **/
140 class logger_singleton : public logger
141 {
143 };
144 
145 } // namespace qx
146 
147 #include <qx/logger/logger.inl>
Base class for logger streams.
A category is a class that identifies a particular piece of code. This code can be located in differe...
Definition: category.h:56
Default logger instance.
Definition: logger.h:141
Logger class.
Definition: logger.h:55
void log(verbosity eVerbosity, string_view svFormat, const category &category, string_view svFile, string_view svFunction, int nLine)
Log to all streams.
Definition: logger.inl:13
bool will_any_stream_accept(const category &category, verbosity eVerbosity, string_view svFile, string_view svFunction) const noexcept
Returns true if any of streams will accept this message.
Definition: logger.inl:57
void add_stream(std::unique_ptr< base_logger_stream > pStream) noexcept
Add output stream to the logger.
Definition: logger.inl:47
requires(log_acceptable_args< args_t... >) void log(verbosity eVerbosity
Log to all streams.
void reset() noexcept
Reset logger and clear all streams.
Definition: logger.inl:52
void flush()
Flush all streams.
Definition: logger.inl:41
#define QX_SINGLETON(T)
Simple Meyer's singleton.
Definition: singleton.h:93
std::basic_format_string wrapper that performs additional compile time checks
Definition: format_string.h:29