Coverage Report

Created: 2026-06-30 07:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/log4cplus/include/log4cplus/loggingmacros.h
Line
Count
Source
1
// -*- C++ -*-
2
// Module:  Log4CPLUS
3
// File:    loggingmacros.h
4
// Created: 8/2003
5
// Author:  Tad E. Smith
6
//
7
//
8
// Copyright 2003-2017 Tad E. Smith
9
//
10
// Licensed under the Apache License, Version 2.0 (the "License");
11
// you may not use this file except in compliance with the License.
12
// You may obtain a copy of the License at
13
//
14
//     http://www.apache.org/licenses/LICENSE-2.0
15
//
16
// Unless required by applicable law or agreed to in writing, software
17
// distributed under the License is distributed on an "AS IS" BASIS,
18
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
// See the License for the specific language governing permissions and
20
// limitations under the License.
21
22
/** @file
23
 * This header defines the logging macros. */
24
25
#ifndef LOG4CPLUS_LOGGING_MACROS_HEADER_
26
#define LOG4CPLUS_LOGGING_MACROS_HEADER_
27
28
#include <log4cplus/config.hxx>
29
30
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
31
#pragma once
32
#endif
33
34
#include <log4cplus/streams.h>
35
#include <log4cplus/logger.h>
36
#include <log4cplus/helpers/snprintf.h>
37
#include <log4cplus/tracelogger.h>
38
#include <sstream>
39
#include <utility>
40
41
42
#if defined(_MSC_VER)
43
#define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()  \
44
    __pragma (warning (push))                 \
45
    __pragma (warning (disable:4127))
46
47
#define LOG4CPLUS_RESTORE_DOWHILE_WARNING()   \
48
    __pragma (warning (pop))
49
50
#else
51
#define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() /* empty */
52
#define LOG4CPLUS_RESTORE_DOWHILE_WARNING() /* empty */
53
54
#endif
55
56
#define LOG4CPLUS_DOWHILE_NOTHING()                 \
57
    LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()            \
58
    do { } while (0)                                \
59
    LOG4CPLUS_RESTORE_DOWHILE_WARNING()
60
61
#if defined(LOG4CPLUS_DISABLE_FATAL) && !defined(LOG4CPLUS_DISABLE_ERROR)
62
#define LOG4CPLUS_DISABLE_ERROR
63
#endif
64
#if defined(LOG4CPLUS_DISABLE_ERROR) && !defined(LOG4CPLUS_DISABLE_WARN)
65
#define LOG4CPLUS_DISABLE_WARN
66
#endif
67
#if defined(LOG4CPLUS_DISABLE_WARN) && !defined(LOG4CPLUS_DISABLE_INFO)
68
#define LOG4CPLUS_DISABLE_INFO
69
#endif
70
#if defined(LOG4CPLUS_DISABLE_INFO) && !defined(LOG4CPLUS_DISABLE_DEBUG)
71
#define LOG4CPLUS_DISABLE_DEBUG
72
#endif
73
#if defined(LOG4CPLUS_DISABLE_DEBUG) && !defined(LOG4CPLUS_DISABLE_TRACE)
74
#define LOG4CPLUS_DISABLE_TRACE
75
#endif
76
77
78
namespace log4cplus
79
{
80
81
namespace detail
82
{
83
84
85
inline
86
Logger
87
macros_get_logger (Logger const & logger)
88
0
{
89
0
    return logger;
90
0
}
91
92
93
inline
94
Logger const &
95
macros_get_logger (Logger & logger)
96
0
{
97
0
    return logger;
98
0
}
99
100
101
inline
102
Logger
103
macros_get_logger (Logger && logger)
104
0
{
105
0
    return std::move (logger);
106
0
}
107
108
inline
109
Logger
110
macros_get_logger (tstring const & logger)
111
0
{
112
0
    return Logger::getInstance (logger);
113
0
}
114
115
116
inline
117
Logger
118
macros_get_logger (tchar const * logger)
119
0
{
120
0
    return Logger::getInstance (logger);
121
0
}
122
123
124
LOG4CPLUS_EXPORT void clear_tostringstream (tostringstream &);
125
126
127
LOG4CPLUS_EXPORT log4cplus::tostringstream & get_macro_body_oss ();
128
LOG4CPLUS_EXPORT log4cplus::helpers::snprintf_buf & get_macro_body_snprintf_buf ();
129
LOG4CPLUS_EXPORT void macro_forced_log (log4cplus::Logger const &,
130
    log4cplus::LogLevel, log4cplus::tstring const &, char const *, int,
131
    char const *);
132
LOG4CPLUS_EXPORT void macro_forced_log (log4cplus::Logger const &,
133
    log4cplus::LogLevel, log4cplus::tchar const *, char const *, int,
134
    char const *);
135
136
137
138
} // namespace detail
139
140
} // namespace log4cplus
141
142
143
#undef LOG4CPLUS_MACRO_FUNCTION
144
#define LOG4CPLUS_MACRO_FUNCTION() nullptr
145
#if ! defined (LOG4CPLUS_DISABLE_FUNCTION_MACRO)
146
#  if defined (LOG4CPLUS_HAVE_FUNCSIG_MACRO)
147
#    undef LOG4CPLUS_MACRO_FUNCTION
148
#    define LOG4CPLUS_MACRO_FUNCTION() __FUNCSIG__
149
#  elif defined (LOG4CPLUS_HAVE_PRETTY_FUNCTION_MACRO)
150
#    undef LOG4CPLUS_MACRO_FUNCTION
151
#    define LOG4CPLUS_MACRO_FUNCTION() __PRETTY_FUNCTION__
152
#  elif defined (LOG4CPLUS_HAVE_FUNCTION_MACRO)
153
#    undef LOG4CPLUS_MACRO_FUNCTION
154
#    define LOG4CPLUS_MACRO_FUNCTION() __FUNCTION__
155
#  elif defined (LOG4CPLUS_HAVE_FUNC_SYMBOL)
156
#    undef LOG4CPLUS_MACRO_FUNCTION
157
#    define LOG4CPLUS_MACRO_FUNCTION() __func__
158
#  endif
159
#endif
160
161
#undef LOG4CPLUS_MACRO_FILE
162
#define LOG4CPLUS_MACRO_FILE() nullptr
163
#if ! defined (LOG4CPLUS_DISABLE_FILE_MACRO)
164
#  undef LOG4CPLUS_MACRO_FILE
165
#  define LOG4CPLUS_MACRO_FILE() __FILE__
166
#endif
167
168
169
// Make TRACE and DEBUG log level unlikely and INFO, WARN, ERROR and
170
// FATAL log level likely.
171
#define LOG4CPLUS_MACRO_TRACE_LOG_LEVEL(pred) \
172
    LOG4CPLUS_UNLIKELY (pred)
173
#define LOG4CPLUS_MACRO_DEBUG_LOG_LEVEL(pred) \
174
    LOG4CPLUS_UNLIKELY (pred)
175
#define LOG4CPLUS_MACRO_INFO_LOG_LEVEL(pred) \
176
    LOG4CPLUS_LIKELY (pred)
177
#define LOG4CPLUS_MACRO_WARN_LOG_LEVEL(pred) \
178
    LOG4CPLUS_LIKELY (pred)
179
#define LOG4CPLUS_MACRO_ERROR_LOG_LEVEL(pred) \
180
    LOG4CPLUS_LIKELY (pred)
181
#define LOG4CPLUS_MACRO_FATAL_LOG_LEVEL(pred) \
182
    LOG4CPLUS_LIKELY (pred)
183
184
185
//! Dispatch to LOG4CPLUS_MACRO_LOGLEVEL_* depending on log level.
186
#define LOG4CPLUS_MACRO_LOGLEVEL_PRED(pred, logLevel)    \
187
    LOG4CPLUS_MACRO_ ## logLevel (pred)
188
189
190
// Either use temporary instances of ostringstream
191
// and snprintf_buf, or use thread-local instances.
192
#if defined (LOG4CPLUS_MACRO_DISABLE_TLS)
193
#  define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var)    \
194
    log4cplus::tostringstream var
195
196
#  define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var)     \
197
    log4cplus::helpers::snprintf_buf var
198
199
#else
200
#  define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var)    \
201
    log4cplus::tostringstream & var                         \
202
        = log4cplus::detail::get_macro_body_oss ()
203
204
#  define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var)     \
205
    log4cplus::helpers::snprintf_buf & var                  \
206
        = log4cplus::detail::get_macro_body_snprintf_buf ()
207
208
#endif
209
210
211
#define LOG4CPLUS_MACRO_BODY(logger, logEvent, logLevel)                \
212
    LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
213
    do {                                                                \
214
        log4cplus::Logger const & _l                                    \
215
            = log4cplus::detail::macros_get_logger (logger);            \
216
        if (LOG4CPLUS_MACRO_LOGLEVEL_PRED (                             \
217
                _l.isEnabledFor (log4cplus::logLevel), logLevel)) {     \
218
            LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM (_log4cplus_buf); \
219
            _log4cplus_buf << logEvent;                                 \
220
            log4cplus::detail::macro_forced_log (_l,                    \
221
                log4cplus::logLevel, _log4cplus_buf.str(),              \
222
                LOG4CPLUS_MACRO_FILE (), __LINE__,                      \
223
                LOG4CPLUS_MACRO_FUNCTION ());                           \
224
        }                                                               \
225
    } while (0)                                                         \
226
    LOG4CPLUS_RESTORE_DOWHILE_WARNING()
227
228
229
#define LOG4CPLUS_MACRO_STR_BODY(logger, logEvent, logLevel)            \
230
    LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
231
    do {                                                                \
232
        log4cplus::Logger const & _l                                    \
233
            = log4cplus::detail::macros_get_logger (logger);            \
234
        if (LOG4CPLUS_MACRO_LOGLEVEL_PRED (                             \
235
                _l.isEnabledFor (log4cplus::logLevel), logLevel)) {     \
236
            log4cplus::detail::macro_forced_log (_l,                    \
237
                log4cplus::logLevel, logEvent,                          \
238
                LOG4CPLUS_MACRO_FILE (), __LINE__,                      \
239
                LOG4CPLUS_MACRO_FUNCTION ());                           \
240
        }                                                               \
241
    } while(0)                                                          \
242
    LOG4CPLUS_RESTORE_DOWHILE_WARNING()
243
244
#define LOG4CPLUS_MACRO_FMT_BODY(logger, logLevel, ...)                 \
245
    LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
246
    do {                                                                \
247
        log4cplus::Logger const & _l                                    \
248
            = log4cplus::detail::macros_get_logger (logger);            \
249
        if (LOG4CPLUS_MACRO_LOGLEVEL_PRED (                             \
250
                _l.isEnabledFor (log4cplus::logLevel), logLevel)) {     \
251
            LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF (_snpbuf);         \
252
            log4cplus::tchar const * _logEvent                          \
253
                = _snpbuf.print (__VA_ARGS__);                          \
254
            log4cplus::detail::macro_forced_log (_l,                    \
255
                log4cplus::logLevel, _logEvent,                         \
256
                LOG4CPLUS_MACRO_FILE (), __LINE__,                      \
257
                LOG4CPLUS_MACRO_FUNCTION ());                           \
258
        }                                                               \
259
    } while(0)                                                          \
260
    LOG4CPLUS_RESTORE_DOWHILE_WARNING()
261
262
/**
263
 * @def LOG4CPLUS_TRACE(logger, logEvent) This macro creates a
264
 * TraceLogger to log a TRACE_LOG_LEVEL message to <code>logger</code>
265
 * upon entry and exiting of a method.
266
 * <code>logEvent</code> will be streamed into an <code>ostream</code>.
267
 */
268
#if !defined(LOG4CPLUS_DISABLE_TRACE)
269
#define LOG4CPLUS_TRACE_METHOD(logger, logEvent)                        \
270
    log4cplus::TraceLogger _log4cplus_trace_logger(logger, logEvent,    \
271
        LOG4CPLUS_MACRO_FILE (), __LINE__,                              \
272
        LOG4CPLUS_MACRO_FUNCTION ());
273
#define LOG4CPLUS_TRACE(logger, logEvent)                               \
274
    LOG4CPLUS_MACRO_BODY (logger, logEvent, TRACE_LOG_LEVEL)
275
#define LOG4CPLUS_TRACE_STR(logger, logEvent)                           \
276
    LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, TRACE_LOG_LEVEL)
277
#define LOG4CPLUS_TRACE_FMT(logger, ...)                                \
278
    LOG4CPLUS_MACRO_FMT_BODY (logger, TRACE_LOG_LEVEL, __VA_ARGS__)
279
280
#else
281
#define LOG4CPLUS_TRACE_METHOD(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
282
#define LOG4CPLUS_TRACE(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
283
#define LOG4CPLUS_TRACE_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
284
#define LOG4CPLUS_TRACE_FMT(logger, logFmt, ...) LOG4CPLUS_DOWHILE_NOTHING()
285
286
#endif
287
288
/**
289
 * @def LOG4CPLUS_DEBUG(logger, logEvent)  This macro is used to log a
290
 * DEBUG_LOG_LEVEL message to <code>logger</code>.
291
 * <code>logEvent</code> will be streamed into an <code>ostream</code>.
292
 */
293
#if !defined(LOG4CPLUS_DISABLE_DEBUG)
294
#define LOG4CPLUS_DEBUG(logger, logEvent)                               \
295
    LOG4CPLUS_MACRO_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
296
#define LOG4CPLUS_DEBUG_STR(logger, logEvent)                           \
297
    LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
298
#define LOG4CPLUS_DEBUG_FMT(logger, ...)                                \
299
    LOG4CPLUS_MACRO_FMT_BODY (logger, DEBUG_LOG_LEVEL, __VA_ARGS__)
300
301
#else
302
#define LOG4CPLUS_DEBUG(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
303
#define LOG4CPLUS_DEBUG_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
304
#define LOG4CPLUS_DEBUG_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
305
306
#endif
307
308
/**
309
 * @def LOG4CPLUS_INFO(logger, logEvent)  This macro is used to log a
310
 * INFO_LOG_LEVEL message to <code>logger</code>.
311
 * <code>logEvent</code> will be streamed into an <code>ostream</code>.
312
 */
313
#if !defined(LOG4CPLUS_DISABLE_INFO)
314
#define LOG4CPLUS_INFO(logger, logEvent)                                \
315
    LOG4CPLUS_MACRO_BODY (logger, logEvent, INFO_LOG_LEVEL)
316
#define LOG4CPLUS_INFO_STR(logger, logEvent)                            \
317
    LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, INFO_LOG_LEVEL)
318
#define LOG4CPLUS_INFO_FMT(logger, ...)                                 \
319
    LOG4CPLUS_MACRO_FMT_BODY (logger, INFO_LOG_LEVEL, __VA_ARGS__)
320
321
#else
322
#define LOG4CPLUS_INFO(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
323
#define LOG4CPLUS_INFO_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
324
#define LOG4CPLUS_INFO_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
325
326
#endif
327
328
/**
329
 * @def LOG4CPLUS_WARN(logger, logEvent)  This macro is used to log a
330
 * WARN_LOG_LEVEL message to <code>logger</code>.
331
 * <code>logEvent</code> will be streamed into an <code>ostream</code>.
332
 */
333
#if !defined(LOG4CPLUS_DISABLE_WARN)
334
#define LOG4CPLUS_WARN(logger, logEvent)                                \
335
    LOG4CPLUS_MACRO_BODY (logger, logEvent, WARN_LOG_LEVEL)
336
#define LOG4CPLUS_WARN_STR(logger, logEvent)                            \
337
    LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, WARN_LOG_LEVEL)
338
#define LOG4CPLUS_WARN_FMT(logger, ...)                                 \
339
    LOG4CPLUS_MACRO_FMT_BODY (logger, WARN_LOG_LEVEL, __VA_ARGS__)
340
341
#else
342
#define LOG4CPLUS_WARN(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
343
#define LOG4CPLUS_WARN_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
344
#define LOG4CPLUS_WARN_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
345
346
#endif
347
348
/**
349
 * @def LOG4CPLUS_ERROR(logger, logEvent)  This macro is used to log a
350
 * ERROR_LOG_LEVEL message to <code>logger</code>.
351
 * <code>logEvent</code> will be streamed into an <code>ostream</code>.
352
 */
353
#if !defined(LOG4CPLUS_DISABLE_ERROR)
354
#define LOG4CPLUS_ERROR(logger, logEvent)                               \
355
    LOG4CPLUS_MACRO_BODY (logger, logEvent, ERROR_LOG_LEVEL)
356
#define LOG4CPLUS_ERROR_STR(logger, logEvent)                           \
357
    LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, ERROR_LOG_LEVEL)
358
#define LOG4CPLUS_ERROR_FMT(logger, ...)                                \
359
    LOG4CPLUS_MACRO_FMT_BODY (logger, ERROR_LOG_LEVEL, __VA_ARGS__)
360
361
#else
362
#define LOG4CPLUS_ERROR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
363
#define LOG4CPLUS_ERROR_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
364
#define LOG4CPLUS_ERROR_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
365
366
#endif
367
368
/**
369
 * @def LOG4CPLUS_FATAL(logger, logEvent)  This macro is used to log a
370
 * FATAL_LOG_LEVEL message to <code>logger</code>.
371
 * <code>logEvent</code> will be streamed into an <code>ostream</code>.
372
 */
373
#if !defined(LOG4CPLUS_DISABLE_FATAL)
374
#define LOG4CPLUS_FATAL(logger, logEvent)                               \
375
    LOG4CPLUS_MACRO_BODY (logger, logEvent, FATAL_LOG_LEVEL)
376
#define LOG4CPLUS_FATAL_STR(logger, logEvent)                           \
377
    LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, FATAL_LOG_LEVEL)
378
#define LOG4CPLUS_FATAL_FMT(logger, ...)                                \
379
    LOG4CPLUS_MACRO_FMT_BODY (logger, FATAL_LOG_LEVEL, __VA_ARGS__)
380
381
#else
382
#define LOG4CPLUS_FATAL(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
383
#define LOG4CPLUS_FATAL_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
384
#define LOG4CPLUS_FATAL_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
385
386
#endif
387
388
//! Helper macro for LOG4CPLUS_ASSERT() macro.
389
#define LOG4CPLUS_ASSERT_STRINGIFY(X) #X
390
391
//! If the `condition` evaluates false, this macro logs it using FATAL
392
//! log level, including the `condition`'s source text.
393
#define LOG4CPLUS_ASSERT(logger, condition)                             \
394
    LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
395
    do {                                                                \
396
        if (LOG4CPLUS_UNLIKELY(! (condition)))                          \
397
            LOG4CPLUS_FATAL_STR ((logger),                              \
398
                LOG4CPLUS_TEXT ("failed condition: ")                   \
399
                LOG4CPLUS_TEXT (LOG4CPLUS_ASSERT_STRINGIFY (condition))); \
400
    } while (0)                                                         \
401
    LOG4CPLUS_RESTORE_DOWHILE_WARNING()
402
403
//! If the `condition` evaluates false, this macro logs a message
404
//! formatted from `printf` format string passed in 3rd and remaining
405
//! arguments.
406
#define LOG4CPLUS_ASSERT_FMT(logger, condition, ...)                    \
407
    LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
408
    do {                                                                \
409
        if (! (condition)) [[unlikely]] {                               \
410
            LOG4CPLUS_FATAL_FMT ((logger), __VA_ARGS__);                \
411
        }                                                               \
412
    } while (false)                                                     \
413
    LOG4CPLUS_RESTORE_DOWHILE_WARNING()
414
415
//! If the `condition` evaluates false, this macro logs a message
416
//! formatted from `std::format` format string passed in 3rd and remaining
417
//! arguments.
418
#define LOG4CPLUS_ASSERT_FORMAT(logger, condition, ...)                 \
419
    LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
420
    do {                                                                \
421
        if (! (condition)) [[unlikely]] {                               \
422
            LOG4CPLUS_FATAL_FORMAT ((logger), __VA_ARGS__);             \
423
        }                                                               \
424
    } while (false)                                                     \
425
    LOG4CPLUS_RESTORE_DOWHILE_WARNING()
426
427
#endif /* LOG4CPLUS_LOGGING_MACROS_HEADER_ */