log4cpp  1.1.6
LogMacros.hh
Go to the documentation of this file.
1 /*
2  * LogMacros.hh
3  *
4  * Copyright 2026, Alexander Perepelkin. All rights reserved.
5  *
6  * See the COPYING file for the terms of usage and distribution.
7  */
8 
9 #ifndef LOG4CPP_LOGMACROS_H
10 #define LOG4CPP_LOGMACROS_H
11 
12 #include <log4cpp/Category.hh>
13 #include <sstream>
14 
41 // Possible values for LOG4CPP_ACTIVE_LEVEL.
42 // These preprocessor constants correspond to the log4cpp::Priority enum values.
43 #define LOG4CPP_PRIORITY_EMERG 0
44 #define LOG4CPP_PRIORITY_FATAL 0 // same as EMERG
45 #define LOG4CPP_PRIORITY_ALERT 100
46 #define LOG4CPP_PRIORITY_CRIT 200
47 #define LOG4CPP_PRIORITY_ERROR 300
48 #define LOG4CPP_PRIORITY_WARN 400
49 #define LOG4CPP_PRIORITY_NOTICE 500
50 #define LOG4CPP_PRIORITY_INFO 600
51 #define LOG4CPP_PRIORITY_DEBUG 700
52 #define LOG4CPP_PRIORITY_NOTSET 800
53 
54 // Compile-time stripping
55 #ifdef LOG4CPP_ACTIVE_LEVEL
56 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_DEBUG
57 #define LOG4CPP_DISABLE_DEBUG
58 #define LOG4CPP_DISABLE_DEBUG_S
59 #endif
60 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_INFO
61 #define LOG4CPP_DISABLE_INFO
62 #define LOG4CPP_DISABLE_INFO_S
63 #endif
64 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_NOTICE
65 #define LOG4CPP_DISABLE_NOTICE
66 #define LOG4CPP_DISABLE_NOTICE_S
67 #endif
68 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_WARN
69 #define LOG4CPP_DISABLE_WARN
70 #define LOG4CPP_DISABLE_WARN_S
71 #endif
72 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_ERROR
73 #define LOG4CPP_DISABLE_ERROR
74 #define LOG4CPP_DISABLE_ERROR_S
75 #endif
76 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_CRIT
77 #define LOG4CPP_DISABLE_CRIT
78 #define LOG4CPP_DISABLE_CRIT_S
79 #endif
80 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_ALERT
81 #define LOG4CPP_DISABLE_ALERT
82 #define LOG4CPP_DISABLE_ALERT_S
83 #endif
84 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_FATAL
85 #define LOG4CPP_DISABLE_FATAL
86 #define LOG4CPP_DISABLE_FATAL_S
87 #endif
88 #if LOG4CPP_ACTIVE_LEVEL < LOG4CPP_PRIORITY_EMERG
89 #define LOG4CPP_DISABLE_EMERG
90 #define LOG4CPP_DISABLE_EMERG_S
91 #endif
92 #endif // LOG4CPP_ACTIVE_LEVEL
93 
94 // Detect variadic macro support
95 #if defined(__cplusplus) && __cplusplus >= 201103L
96 #define LOG4CPP_VARIADIC_MACROS_SUPPORTED 1
97 #elif defined(_MSC_VER) && _MSC_VER >= 1400
98 #define LOG4CPP_VARIADIC_MACROS_SUPPORTED 1
99 #else
100 #define LOG4CPP_VARIADIC_MACROS_SUPPORTED 0
101 #endif
102 
103 // Generic formatted logging
104 #if LOG4CPP_VARIADIC_MACROS_SUPPORTED
105 #define LOG4CPP_LOG(logger, priority, ...) \
106  do { \
107  if ((logger).isPriorityEnabled(priority)) { \
108  (logger).log(priority, __VA_ARGS__); \
109  } \
110  } while (0)
111 
124 #define LOG4CPP_LOG(logger, priority, ...) \
125  do { \
126  if ((logger).isPriorityEnabled(priority)) { \
127  (logger).log(priority, __VA_ARGS__); \
128  } \
129  } while (0)
130 
131 // Level macros using DISABLE flags
132 #ifdef LOG4CPP_DISABLE_DEBUG
133 #define LOG4CPP_DEBUG(logger, ...) ((void)0)
134 #else
135 
141 #define LOG4CPP_DEBUG(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::DEBUG, __VA_ARGS__)
142 #endif
143 
144 #ifdef LOG4CPP_DISABLE_INFO
145 #define LOG4CPP_INFO(logger, ...) ((void)0)
146 #else
147 
153 #define LOG4CPP_INFO(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::INFO, __VA_ARGS__)
154 #endif
155 
156 #ifdef LOG4CPP_DISABLE_NOTICE
157 #define LOG4CPP_NOTICE(logger, ...) ((void)0)
158 #else
159 
165 #define LOG4CPP_NOTICE(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::NOTICE, __VA_ARGS__)
166 #endif
167 
168 #ifdef LOG4CPP_DISABLE_WARN
169 #define LOG4CPP_WARN(logger, ...) ((void)0)
170 #else
171 
177 #define LOG4CPP_WARN(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::WARN, __VA_ARGS__)
178 #endif
179 
180 #ifdef LOG4CPP_DISABLE_ERROR
181 #define LOG4CPP_ERROR(logger, ...) ((void)0)
182 #else
183 
189 #define LOG4CPP_ERROR(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::ERROR, __VA_ARGS__)
190 #endif
191 
192 #ifdef LOG4CPP_DISABLE_CRIT
193 #define LOG4CPP_CRIT(logger, ...) ((void)0)
194 #else
195 
201 #define LOG4CPP_CRIT(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::CRIT, __VA_ARGS__)
202 #endif
203 
204 #ifdef LOG4CPP_DISABLE_ALERT
205 #define LOG4CPP_ALERT(logger, ...) ((void)0)
206 #else
207 
213 #define LOG4CPP_ALERT(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::ALERT, __VA_ARGS__)
214 #endif
215 
216 #ifdef LOG4CPP_DISABLE_FATAL
217 #define LOG4CPP_FATAL(logger, ...) ((void)0)
218 #else
219 
225 #define LOG4CPP_FATAL(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::FATAL, __VA_ARGS__)
226 #endif
227 
228 #ifdef LOG4CPP_DISABLE_EMERG
229 #define LOG4CPP_EMERG(logger, ...) ((void)0)
230 #else
231 
237 #define LOG4CPP_EMERG(logger, ...) LOG4CPP_LOG(logger, log4cpp::Priority::EMERG, __VA_ARGS__)
238 #endif
239 
240 #else // LOG4CPP_VARIADIC_MACROS_SUPPORTED
241 // Fallback for C++98: fixed-argument macros
242 #define LOG4CPP_LOG_NO_VA(logger, priority, msg) \
243  do { \
244  if ((logger).isPriorityEnabled(priority)) { \
245  (logger).log(priority, msg); \
246  } \
247  } while (0)
248 
249 #ifdef LOG4CPP_DISABLE_DEBUG
250 #define LOG4CPP_DEBUG(logger, msg) ((void)0)
251 #else
252 #define LOG4CPP_DEBUG(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::DEBUG, msg)
253 #endif
254 
255 #ifdef LOG4CPP_DISABLE_INFO
256 #define LOG4CPP_INFO(logger, msg) ((void)0)
257 #else
258 #define LOG4CPP_INFO(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::INFO, msg)
259 #endif
260 
261 #ifdef LOG4CPP_DISABLE_NOTICE
262 #define LOG4CPP_NOTICE(logger, msg) ((void)0)
263 #else
264 #define LOG4CPP_NOTICE(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::NOTICE, msg)
265 #endif
266 
267 #ifdef LOG4CPP_DISABLE_WARN
268 #define LOG4CPP_WARN(logger, msg) ((void)0)
269 #else
270 #define LOG4CPP_WARN(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::WARN, msg)
271 #endif
272 
273 #ifdef LOG4CPP_DISABLE_ERROR
274 #define LOG4CPP_ERROR(logger, msg) ((void)0)
275 #else
276 #define LOG4CPP_ERROR(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::ERROR, msg)
277 #endif
278 
279 #ifdef LOG4CPP_DISABLE_CRIT
280 #define LOG4CPP_CRIT(logger, msg) ((void)0)
281 #else
282 #define LOG4CPP_CRIT(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::CRIT, msg)
283 #endif
284 
285 #ifdef LOG4CPP_DISABLE_ALERT
286 #define LOG4CPP_ALERT(logger, msg) ((void)0)
287 #else
288 #define LOG4CPP_ALERT(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::ALERT, msg)
289 #endif
290 
291 #ifdef LOG4CPP_DISABLE_FATAL
292 #define LOG4CPP_FATAL(logger, msg) ((void)0)
293 #else
294 #define LOG4CPP_FATAL(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::FATAL, msg)
295 #endif
296 
297 #ifdef LOG4CPP_DISABLE_EMERG
298 #define LOG4CPP_EMERG(logger, msg) ((void)0)
299 #else
300 #define LOG4CPP_EMERG(logger, msg) LOG4CPP_LOG_NO_VA(logger, log4cpp::Priority::EMERG, msg)
301 #endif
302 
303 #endif // LOG4CPP_VARIADIC_MACROS_SUPPORTED
304 
305 // Streaming macros
306 // Generic streaming logging
307 #define LOG4CPP_STREAM(logger, priority, streamSequence) \
308  do { \
309  if ((logger).isPriorityEnabled(priority)) { \
310  (logger).getStream(priority) << streamSequence; \
311  } \
312  } while (0)
313 
314 #ifdef LOG4CPP_DISABLE_DEBUG_S
315 #define LOG4CPP_DEBUG_S(logger, streamSequence) ((void)0)
316 #else
317 #define LOG4CPP_DEBUG_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::DEBUG, streamSequence)
318 #endif
319 
320 #ifdef LOG4CPP_DISABLE_INFO_S
321 #define LOG4CPP_INFO_S(logger, streamSequence) ((void)0)
322 #else
323 #define LOG4CPP_INFO_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::INFO, streamSequence)
324 #endif
325 
326 #ifdef LOG4CPP_DISABLE_NOTICE_S
327 #define LOG4CPP_NOTICE_S(logger, streamSequence) ((void)0)
328 #else
329 #define LOG4CPP_NOTICE_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::NOTICE, streamSequence)
330 #endif
331 
332 #ifdef LOG4CPP_DISABLE_WARN_S
333 #define LOG4CPP_WARN_S(logger, streamSequence) ((void)0)
334 #else
335 #define LOG4CPP_WARN_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::WARN, streamSequence)
336 #endif
337 
338 #ifdef LOG4CPP_DISABLE_ERROR_S
339 #define LOG4CPP_ERROR_S(logger, streamSequence) ((void)0)
340 #else
341 #define LOG4CPP_ERROR_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::ERROR, streamSequence)
342 #endif
343 
344 #ifdef LOG4CPP_DISABLE_CRIT_S
345 #define LOG4CPP_CRIT_S(logger, streamSequence) ((void)0)
346 #else
347 #define LOG4CPP_CRIT_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::CRIT, streamSequence)
348 #endif
349 
350 #ifdef LOG4CPP_DISABLE_ALERT_S
351 #define LOG4CPP_ALERT_S(logger, streamSequence) ((void)0)
352 #else
353 #define LOG4CPP_ALERT_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::ALERT, streamSequence)
354 #endif
355 
356 #ifdef LOG4CPP_DISABLE_FATAL_S
357 #define LOG4CPP_FATAL_S(logger, streamSequence) ((void)0)
358 #else
359 #define LOG4CPP_FATAL_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::FATAL, streamSequence)
360 #endif
361 
362 #ifdef LOG4CPP_DISABLE_EMERG_S
363 #define LOG4CPP_EMERG_S(logger, streamSequence) ((void)0)
364 #else
365 #define LOG4CPP_EMERG_S(logger, streamSequence) LOG4CPP_STREAM(logger, log4cpp::Priority::EMERG, streamSequence)
366 #endif
367 
368 #endif // LOG4CPP_LOGMACROS_H