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 #include <qx/sbo/sbo_poly.h>
14 
15 #ifndef QX_LOGGER_INSTANCE
16  #define QX_LOGGER_INSTANCE qx::logger_singleton::get_instance().get_logger()
17 #endif
18 
19 #ifndef QX_LOG_C
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.log( \
29  category, \
30  eVerbosity, \
31  QX_SHORT_FILE, \
32  qx::to_string(__FUNCTION__), \
33  QX_LINE, \
34  QXT(format), \
35  ##__VA_ARGS__)
36 #endif
37 
38 #ifndef QX_LOG
39  /**
40  @def QX_LOG
41  @brief Log message
42  @param eVerbosity - message verbosity
43  @param format - format string
44  @param ... - additional args for formatting
45  **/
46  #define QX_LOG(eVerbosity, format, ...) QX_LOG_C(CatDefault, eVerbosity, format, ##__VA_ARGS__)
47 #endif
48 
49 namespace qx
50 {
51 
52 template<class... args_t>
53 concept log_acceptable_args_c = (sizeof...(args_t) > 0 && format_acceptable_args_c<char_type, args_t...>);
54 
55 /**
56 
57  @class logger
58  @brief Logger class
59  @author Khrapov
60  @date 10.01.2020
61 
62 **/
63 class logger
64 {
65 public:
66  /**
67  @brief Log to all streams
68  @param category - code category
69  @param eVerbosity - message verbosity
70  @param svFile - file name string
71  @param svFunction - function name string
72  @param nLine - code line number
73  @param svMessage - message string
74  **/
75  void log(
76  const category& category,
77  verbosity eVerbosity,
78  string_view svFile,
79  string_view svFunction,
80  int nLine,
81  string_view svMessage);
82 
83  /**
84  @brief Log to all streams
85  @tparam args_t - template parameter pack type
86  @param category - code category
87  @param eVerbosity - message verbosity
88  @param svFile - file name string
89  @param svFunction - function name string
90  @param nLine - code line number
91  @param sFormat - format string
92  @param args - additional args for format
93  **/
94  template<class... args_t>
95  requires(log_acceptable_args_c<args_t...>)
96  void log(
97  const category& category,
98  verbosity eVerbosity,
99  string_view svFile,
100  string_view svFunction,
101  int nLine,
103  args_t&&... args);
104 
105  /**
106  @brief Flush all streams
107  **/
108  void flush();
109 
110  /**
111  @brief Add an output stream to the logger
112  @tparam stream_t - stream type, derived from base_logger_stream
113  @param stream - stream object
114  **/
115  template<sbo_poly_assignable_c<base_logger_stream> stream_t>
116  void add_stream(stream_t stream) noexcept;
117 
118  /**
119  @brief Reset logger and clear all streams
120  **/
121  void reset() noexcept;
122 
123  /**
124  @brief Returns true if any of streams will accept this message
125  @details Typically you don't want to use it
126  It may be useful with async logging to avoid unnecessary formatting and queueing
127  @param category - code category
128  @param eVerbosity - message verbosity
129  @param svFile - file name string
130  @param svFunction - function name string
131  @retval - true if any of streams will accept this message
132  **/
134  const category& category,
135  verbosity eVerbosity,
136  string_view svFile,
137  string_view svFunction) const noexcept;
138 
139 private:
140  std::vector<sbo_poly<base_logger_stream, 1024>> m_Streams;
141 };
142 
143 /**
144 
145  @class logger_singleton
146  @brief Default logger instance
147  @author Khrapov
148  @date 19.08.2021
149 
150 **/
152 {
153 public:
154  logger& get_logger()
155  {
156  return m_Logger;
157  }
158 
159 private:
160  logger m_Logger;
161 };
162 
163 } // namespace qx
164 
165 #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:59
Default logger instance.
Definition: logger.h:152
Logger class.
Definition: logger.h:64
requires(log_acceptable_args_c< args_t... >) void log(const category &category
Log to all streams.
void add_stream(stream_t stream) noexcept
Add an output stream to the logger.
Definition: logger.inl:48
void log(const category &category, verbosity eVerbosity, string_view svFile, string_view svFunction, int nLine, string_view svMessage)
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:58
void reset() noexcept
Reset logger and clear all streams.
Definition: logger.inl:53
void flush()
Flush all streams.
Definition: logger.inl:41
Small Buffer Object for polymorphic classes.
Definition: sbo_poly.h:36
Inherit the necessary singleton class from this.
std::basic_format_string wrapper that performs additional compile time checks
Definition: format_string.h:29