8#ifndef INCLUDED_BALL_LOG
9#define INCLUDED_BALL_LOG
1174#include <balscm_version.h>
1188#include <bsl_ostream.h>
1196#define BALL_LOG_CATEGORY \
1197 (ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)->category())
1199#define BALL_LOG_THRESHOLD \
1200 (ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)->threshold())
1202#define BALL_LOG_RECORD (ball_log_lOg_StReAm.record())
1204#define BALL_LOG_OUTPUT_STREAM (ball_log_lOg_StReAm.stream())
1210#define BALL_LOG_SET_CATEGORY(CATEGORY) \
1211 static BloombergLP::ball::CategoryHolder BALL_LOG_CATEGORYHOLDER = { \
1212 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1215 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!BALL_LOG_CATEGORY)) { \
1216 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1217 BloombergLP::ball::Log::setCategoryHierarchically( \
1218 &BALL_LOG_CATEGORYHOLDER, \
1222#define BALL_LOG_SET_LEGACY_CATEGORY(CATEGORY) \
1223 static BloombergLP::ball::CategoryHolder BALL_LOG_CATEGORYHOLDER = { \
1224 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1227 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!BALL_LOG_CATEGORY)) { \
1228 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1229 BloombergLP::ball::Log::setCategory(&BALL_LOG_CATEGORYHOLDER, \
1233#define BALL_LOG_SET_CATEGORY_HIERARCHICALLY(CATEGORY) \
1234 static BloombergLP::ball::CategoryHolder BALL_LOG_CATEGORYHOLDER = { \
1235 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1238 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!BALL_LOG_CATEGORY)) { \
1239 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1240 BloombergLP::ball::Log::setCategoryHierarchically( \
1241 &BALL_LOG_CATEGORYHOLDER, \
1245#define BALL_LOG_SET_DYNAMIC_CATEGORY(CATEGORY) \
1246 const BloombergLP::ball::Category *BALL_LOG_DYNAMIC_CATEGORY = \
1247 BloombergLP::ball::Log::setCategoryHierarchically(CATEGORY); \
1248 BloombergLP::ball::CategoryHolder BALL_LOG_CATEGORYHOLDER = { \
1249 { BloombergLP::ball::CategoryHolder::e_DYNAMIC_CATEGORY }, \
1250 { const_cast<BloombergLP::ball::Category *>( \
1251 BALL_LOG_DYNAMIC_CATEGORY) }, \
1255#define BALL_LOG_SET_LEGACY_DYNAMIC_CATEGORY(CATEGORY) \
1256 const BloombergLP::ball::Category *BALL_LOG_DYNAMIC_CATEGORY = \
1257 BloombergLP::ball::Log::setCategory(CATEGORY); \
1258 BloombergLP::ball::CategoryHolder BALL_LOG_CATEGORYHOLDER = { \
1259 { BloombergLP::ball::CategoryHolder::e_DYNAMIC_CATEGORY }, \
1260 { const_cast<BloombergLP::ball::Category *>( \
1261 BALL_LOG_DYNAMIC_CATEGORY) }, \
1265#define BALL_LOG_SET_DYNAMIC_CATEGORY_HIERARCHICALLY(CATEGORY) \
1266 const BloombergLP::ball::Category *BALL_LOG_DYNAMIC_CATEGORY = \
1267 BloombergLP::ball::Log::setCategoryHierarchically(CATEGORY); \
1268 BloombergLP::ball::CategoryHolder BALL_LOG_CATEGORYHOLDER = { \
1269 { BloombergLP::ball::CategoryHolder::e_DYNAMIC_CATEGORY }, \
1270 { const_cast<BloombergLP::ball::Category *>( \
1271 BALL_LOG_DYNAMIC_CATEGORY) }, \
1279#define BALL_LOG_SET_CLASS_CATEGORY(CATEGORY) \
1281 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder( \
1282 const BloombergLP::ball::CategoryHolder& categoryHolder) \
1284 return &categoryHolder; \
1287 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder(int) \
1289 static BloombergLP::ball::CategoryHolder holder = { \
1290 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1293 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!holder.category())) { \
1294 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1295 BloombergLP::ball::Log::setCategoryHierarchically(&holder, \
1300 enum { BALL_LOG_CATEGORYHOLDER = 0 }
1302#define BALL_LOG_SET_LEGACY_CLASS_CATEGORY(CATEGORY) \
1304 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder( \
1305 const BloombergLP::ball::CategoryHolder& categoryHolder) \
1307 return &categoryHolder; \
1310 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder(int) \
1312 static BloombergLP::ball::CategoryHolder holder = { \
1313 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1316 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!holder.category())) { \
1317 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1318 BloombergLP::ball::Log::setCategory(&holder, CATEGORY); \
1322 enum { BALL_LOG_CATEGORYHOLDER = 0 }
1324#define BALL_LOG_SET_CLASS_CATEGORY_HIERARCHICALLY(CATEGORY) \
1326 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder( \
1327 const BloombergLP::ball::CategoryHolder& categoryHolder) \
1329 return &categoryHolder; \
1332 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder(int) \
1334 static BloombergLP::ball::CategoryHolder holder = { \
1335 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1338 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!holder.category())) { \
1339 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1340 BloombergLP::ball::Log::setCategoryHierarchically(&holder, \
1345 enum { BALL_LOG_CATEGORYHOLDER = 0 }
1351#define BALL_LOG_SET_NAMESPACE_CATEGORY(CATEGORY) \
1354 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder(int) \
1356 static BloombergLP::ball::CategoryHolder holder = { \
1357 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1360 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!holder.category())) { \
1361 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1362 BloombergLP::ball::Log::setCategoryHierarchically(&holder, \
1367 enum { BALL_LOG_CATEGORYHOLDER = 0 }; \
1370#define BALL_LOG_SET_LEGACY_NAMESPACE_CATEGORY(CATEGORY) \
1373 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder(int) \
1375 static BloombergLP::ball::CategoryHolder holder = { \
1376 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1379 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!holder.category())) { \
1380 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1381 BloombergLP::ball::Log::setCategory(&holder, CATEGORY); \
1385 enum { BALL_LOG_CATEGORYHOLDER = 0 }; \
1388#define BALL_LOG_SET_NAMESPACE_CATEGORY_HIERARCHICALLY(CATEGORY) \
1391 const BloombergLP::ball::CategoryHolder *ball_log_getCategoryHolder(int) \
1393 static BloombergLP::ball::CategoryHolder holder = { \
1394 { BloombergLP::ball::CategoryHolder::e_UNINITIALIZED_CATEGORY }, \
1397 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY(!holder.category())) { \
1398 BSLS_PERFORMANCEHINT_UNLIKELY_HINT; \
1399 BloombergLP::ball::Log::setCategoryHierarchically(&holder, \
1404 enum { BALL_LOG_CATEGORYHOLDER = 0 }; \
1414#define BALL_LOG_STREAM_CONST_IMP(SEVERITY) \
1415for (const BloombergLP::ball::CategoryHolder *ball_log_cAtEgOrYhOlDeR = \
1416 BloombergLP::ball::Log::categoryHolderIfEnabled<(SEVERITY)>( \
1417 ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)); \
1418 ball_log_cAtEgOrYhOlDeR; \
1420for (BloombergLP::ball::Log_Stream ball_log_lOg_StReAm( \
1421 ball_log_cAtEgOrYhOlDeR->category(), \
1425 ball_log_cAtEgOrYhOlDeR; \
1426 ball_log_cAtEgOrYhOlDeR = 0)
1431#define BALL_LOG_STREAM_IMP(SEVERITY) \
1432for (const BloombergLP::ball::CategoryHolder *ball_log_cAtEgOrYhOlDeR = \
1433 ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER); \
1434 ball_log_cAtEgOrYhOlDeR \
1435 && ball_log_cAtEgOrYhOlDeR->threshold() >= (SEVERITY) \
1436 && BloombergLP::ball::Log::isCategoryEnabled(ball_log_cAtEgOrYhOlDeR, \
1439for (BloombergLP::ball::Log_Stream ball_log_lOg_StReAm( \
1440 ball_log_cAtEgOrYhOlDeR->category(), \
1444 ball_log_cAtEgOrYhOlDeR; \
1445 ball_log_cAtEgOrYhOlDeR = 0)
1451#define BALL_LOG_STREAM(SEVERITY) \
1452 BALL_LOG_STREAM_IMP((SEVERITY)) BALL_LOG_OUTPUT_STREAM
1454#define BALL_LOG_TRACE \
1455 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_TRACE) \
1456 BALL_LOG_OUTPUT_STREAM
1458#define BALL_LOG_DEBUG \
1459 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG) \
1460 BALL_LOG_OUTPUT_STREAM
1462#define BALL_LOG_INFO \
1463 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_INFO) \
1464 BALL_LOG_OUTPUT_STREAM
1466#define BALL_LOG_WARN \
1467 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_WARN) \
1468 BALL_LOG_OUTPUT_STREAM
1470#define BALL_LOG_ERROR \
1471 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_ERROR) \
1472 BALL_LOG_OUTPUT_STREAM
1474#define BALL_LOG_FATAL \
1475 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_FATAL) \
1476 BALL_LOG_OUTPUT_STREAM
1478#define BALL_LOG_STREAM_BLOCK(SEVERITY) BALL_LOG_STREAM_IMP((SEVERITY))
1480#define BALL_LOG_TRACE_BLOCK \
1481 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_TRACE)
1483#define BALL_LOG_DEBUG_BLOCK \
1484 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG)
1486#define BALL_LOG_INFO_BLOCK \
1487 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_INFO)
1489#define BALL_LOG_WARN_BLOCK \
1490 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_WARN)
1492#define BALL_LOG_ERROR_BLOCK \
1493 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_ERROR)
1495#define BALL_LOG_FATAL_BLOCK \
1496 BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_FATAL)
1498#define BALL_LOG_END ""
1507#define BALL_LOGCB_STREAM_CONST_IMP(SEVERITY, CALLBACK) \
1508for (const BloombergLP::ball::CategoryHolder *ball_log_cAtEgOrYhOlDeR = \
1509 BloombergLP::ball::Log::categoryHolderIfEnabled<(SEVERITY)>( \
1510 ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)); \
1511 ball_log_cAtEgOrYhOlDeR; \
1513for (BloombergLP::ball::Log_Stream ball_log_lOg_StReAm( \
1514 ball_log_cAtEgOrYhOlDeR->category(), \
1518 ball_log_cAtEgOrYhOlDeR \
1519 && (CALLBACK(&BALL_LOG_RECORD->customFields()), true); \
1520 ball_log_cAtEgOrYhOlDeR = 0)
1525#define BALL_LOGCB_STREAM_IMP(SEVERITY, CALLBACK) \
1526for (const BloombergLP::ball::CategoryHolder *ball_log_cAtEgOrYhOlDeR = \
1527 ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER); \
1528 ball_log_cAtEgOrYhOlDeR \
1529 && ball_log_cAtEgOrYhOlDeR->threshold() >= (SEVERITY) \
1530 && BloombergLP::ball::Log::isCategoryEnabled(ball_log_cAtEgOrYhOlDeR, \
1533for (BloombergLP::ball::Log_Stream ball_log_lOg_StReAm( \
1534 ball_log_cAtEgOrYhOlDeR->category(), \
1538 ball_log_cAtEgOrYhOlDeR \
1539 && (CALLBACK(&BALL_LOG_RECORD->customFields()), true); \
1540 ball_log_cAtEgOrYhOlDeR = 0)
1546#define BALL_LOGCB_STREAM(BALL_SEVERITY, CALLBACK) \
1547 BALL_LOGCB_STREAM_IMP((BALL_SEVERITY), (CALLBACK)) BALL_LOG_OUTPUT_STREAM
1549#define BALL_LOGCB_TRACE(CALLBACK) \
1550 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_TRACE, \
1552 BALL_LOG_OUTPUT_STREAM
1554#define BALL_LOGCB_DEBUG(CALLBACK) \
1555 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG, \
1557 BALL_LOG_OUTPUT_STREAM
1559#define BALL_LOGCB_INFO(CALLBACK) \
1560 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_INFO, \
1562 BALL_LOG_OUTPUT_STREAM
1564#define BALL_LOGCB_WARN(CALLBACK) \
1565 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_WARN, \
1567 BALL_LOG_OUTPUT_STREAM
1569#define BALL_LOGCB_ERROR(CALLBACK) \
1570 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_ERROR, \
1572 BALL_LOG_OUTPUT_STREAM
1574#define BALL_LOGCB_FATAL(CALLBACK) \
1575 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_FATAL, \
1577 BALL_LOG_OUTPUT_STREAM
1579#define BALL_LOGCB_STREAM_BLOCK(BALL_SEVERITY, CALLBACK) \
1580 BALL_LOGCB_STREAM_IMP((BALL_SEVERITY), (CALLBACK))
1582#define BALL_LOGCB_TRACE_BLOCK(CALLBACK) \
1583 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_TRACE, \
1586#define BALL_LOGCB_DEBUG_BLOCK(CALLBACK) \
1587 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG, \
1590#define BALL_LOGCB_INFO_BLOCK(CALLBACK) \
1591 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_INFO, \
1594#define BALL_LOGCB_WARN_BLOCK(CALLBACK) \
1595 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_WARN, \
1598#define BALL_LOGCB_ERROR_BLOCK(CALLBACK) \
1599 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_ERROR, \
1602#define BALL_LOGCB_FATAL_BLOCK(CALLBACK) \
1603 BALL_LOGCB_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_FATAL, \
1606#define BALL_LOGCB_END ""
1615#define BALL_LOGVA_CONST_IMP(SEVERITY, ...) \
1617 if (const BloombergLP::ball::CategoryHolder *ball_log_cAtEgOrYhOlDeR = \
1618 BloombergLP::ball::Log::categoryHolderIfEnabled<(SEVERITY)>( \
1619 ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER))) { \
1620 BloombergLP::ball::Log_Formatter ball_log_fOrMaTtEr( \
1621 ball_log_cAtEgOrYhOlDeR->category(), \
1625 BloombergLP::ball::Log::format(ball_log_fOrMaTtEr.messageBuffer(), \
1626 ball_log_fOrMaTtEr.messageBufferLen(), \
1638#define BALL_LOGVA(SEVERITY, ...) \
1640 const BloombergLP::ball::CategoryHolder *ball_log_cAtEgOrYhOlDeR = \
1641 ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER); \
1642 if (ball_log_cAtEgOrYhOlDeR->threshold() >= (SEVERITY) && \
1643 BloombergLP::ball::Log::isCategoryEnabled(ball_log_cAtEgOrYhOlDeR, \
1645 BloombergLP::ball::Log_Formatter ball_log_fOrMaTtEr( \
1646 ball_log_cAtEgOrYhOlDeR->category(), \
1650 BloombergLP::ball::Log::format(ball_log_fOrMaTtEr.messageBuffer(), \
1651 ball_log_fOrMaTtEr.messageBufferLen(), \
1656#define BALL_LOGVA_TRACE(...) \
1657 BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_TRACE, __VA_ARGS__)
1659#define BALL_LOGVA_DEBUG(...) \
1660 BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG, __VA_ARGS__)
1662#define BALL_LOGVA_INFO( ...) \
1663 BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_INFO, __VA_ARGS__)
1665#define BALL_LOGVA_WARN( ...) \
1666 BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_WARN, __VA_ARGS__)
1668#define BALL_LOGVA_ERROR(...) \
1669 BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_ERROR, __VA_ARGS__)
1671#define BALL_LOGVA_FATAL(...) \
1672 BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_FATAL, __VA_ARGS__)
1678#define BALL_LOG_IS_ENABLED(SEVERITY) \
1679 ((BALL_LOG_THRESHOLD >= (SEVERITY)) \
1680 && BloombergLP::ball::Log::isCategoryEnabled( \
1681 ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER), \
1708 const BloombergLP::ball::CategoryHolder& categoryHolder)
1710 return &categoryHolder;
1745 bsl::size_t numBytes,
1760 const
bsl::string_view& fileName,
1785 const
bsl::string_view& fileName,
1787 const
bsl::string_view& message);
1861 template <
int t_SEVERITY>
1875 const
char *categoryName);
1913 const
char *categoryName);
1951 const int d_severity;
1985 bsl::ostream& stream();
1996 const
Record *record() const;
1999 int severity() const;
2030 const int d_severity;
2065 char *messageBuffer();
2080 int messageBufferLen()
const;
2085 const Record *record()
const;
2088 int severity()
const;
2100template <
int t_SEVERITY>
2115 return categoryHolder;
2126 categoryHolder->
threshold() >= t_SEVERITY)) {
2133 return categoryHolder;
2168 return d_category_p;
2191 return d_buffer.get();
2204 return d_category_p;
Definition ball_category.h:367
int threshold() const
Return the threshold level held by this holder.
Definition ball_category.h:621
Definition ball_category.h:184
Definition ball_log.h:1943
bsl::ostream & stream()
Definition ball_log.h:2159
const Category * category() const
Definition ball_log.h:2166
~Log_Stream() BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(false)
Record * record()
Definition ball_log.h:2153
Log_Stream(const Category *category, const bsl::string_view &fileName, int lineNumber, int severity)
int severity() const
Return the severity held by this logging stream.
Definition ball_log.h:2178
bsl::ostream & messageStream()
Definition ball_recordattributes.h:558
Definition ball_record.h:176
RecordAttributes & fixedFields()
Return the modifiable fixed fields of this log record.
Definition ball_record.h:397
Definition bslstl_stringview.h:471
Definition bslma_managedptr.h:1173
#define BSLS_ANNOTATION_PRINTF(fmt, arg)
Definition bsls_annotation.h:348
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(...)
Definition bsls_keyword.h:676
Definition ball_administration.h:214
const BloombergLP::ball::CategoryHolder * ball_log_getCategoryHolder(const BloombergLP::ball::CategoryHolder &categoryHolder)
Definition ball_log.h:1707
Definition bdlat_valuetypefunctions.h:939
Definition baljsn_encoder_testtypes.h:76
Definition bslmt_barrier.h:344
Definition ball_log.h:1726
static void releaseMessageBuffer(bslmt::Mutex *mutex)
static int static Record * getRecord(const Category *category, const bsl::string_view &fileName, int lineNumber)
static const CategoryHolder * categoryHolderIfEnabled(const CategoryHolder *categoryHolder)
Definition ball_log.h:2102
static int format(char *buffer, bsl::size_t numBytes, const char *format,...) BSLS_ANNOTATION_PRINTF(3
static void logMessage(const Category *category, int severity, const bsl::string_view &fileName, int lineNumber, const bsl::string_view &message)
static bool isCategoryEnabled(const CategoryHolder *categoryHolder, int severity)
static const Category * setCategory(const char *categoryName)
static char * obtainMessageBuffer(bslmt::Mutex **mutex, int *bufferSize)
static const Category * setCategoryHierarchically(const char *categoryName)
Definition ball_log.h:2142
@ e_INFO
Definition ball_severity.h:177