BDE 4.14.0 Production release
|
Macros | |
#define | BALL_LOG_CATEGORY (ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)->category()) |
#define | BALL_LOG_THRESHOLD (ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)->threshold()) |
#define | BALL_LOG_RECORD (ball_log_lOg_StReAm.record()) |
#define | BALL_LOG_OUTPUT_STREAM (ball_log_lOg_StReAm.stream()) |
#define | BALL_LOG_SET_CATEGORY(CATEGORY) |
#define | BALL_LOG_SET_CATEGORY_HIERARCHICALLY(CATEGORY) |
#define | BALL_LOG_SET_DYNAMIC_CATEGORY(CATEGORY) |
#define | BALL_LOG_SET_DYNAMIC_CATEGORY_HIERARCHICALLY(CATEGORY) |
#define | BALL_LOG_SET_CLASS_CATEGORY(CATEGORY) |
#define | BALL_LOG_SET_CLASS_CATEGORY_HIERARCHICALLY(CATEGORY) |
#define | BALL_LOG_SET_NAMESPACE_CATEGORY(CATEGORY) |
#define | BALL_LOG_SET_NAMESPACE_CATEGORY_HIERARCHICALLY(CATEGORY) |
#define | BALL_LOG_STREAM_CONST_IMP(SEVERITY) |
#define | BALL_LOG_STREAM_IMP(SEVERITY) |
#define | BALL_LOG_STREAM(SEVERITY) BALL_LOG_STREAM_IMP((SEVERITY)) BALL_LOG_OUTPUT_STREAM |
#define | BALL_LOG_TRACE |
#define | BALL_LOG_DEBUG |
#define | BALL_LOG_INFO |
#define | BALL_LOG_WARN |
#define | BALL_LOG_ERROR |
#define | BALL_LOG_FATAL |
#define | BALL_LOG_STREAM_BLOCK(SEVERITY) BALL_LOG_STREAM_IMP((SEVERITY)) |
#define | BALL_LOG_TRACE_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_TRACE) |
#define | BALL_LOG_DEBUG_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG) |
#define | BALL_LOG_INFO_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_INFO) |
#define | BALL_LOG_WARN_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_WARN) |
#define | BALL_LOG_ERROR_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_ERROR) |
#define | BALL_LOG_FATAL_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_FATAL) |
#define | BALL_LOG_END "" |
#define | BALL_LOGCB_STREAM_CONST_IMP(SEVERITY, CALLBACK) |
#define | BALL_LOGCB_STREAM_IMP(SEVERITY, CALLBACK) |
#define | BALL_LOGCB_STREAM(BALL_SEVERITY, CALLBACK) BALL_LOGCB_STREAM_IMP((BALL_SEVERITY), (CALLBACK)) BALL_LOG_OUTPUT_STREAM |
#define | BALL_LOGCB_TRACE(CALLBACK) |
#define | BALL_LOGCB_DEBUG(CALLBACK) |
#define | BALL_LOGCB_INFO(CALLBACK) |
#define | BALL_LOGCB_WARN(CALLBACK) |
#define | BALL_LOGCB_ERROR(CALLBACK) |
#define | BALL_LOGCB_FATAL(CALLBACK) |
#define | BALL_LOGCB_STREAM_BLOCK(BALL_SEVERITY, CALLBACK) BALL_LOGCB_STREAM_IMP((BALL_SEVERITY), (CALLBACK)) |
#define | BALL_LOGCB_TRACE_BLOCK(CALLBACK) |
#define | BALL_LOGCB_DEBUG_BLOCK(CALLBACK) |
#define | BALL_LOGCB_INFO_BLOCK(CALLBACK) |
#define | BALL_LOGCB_WARN_BLOCK(CALLBACK) |
#define | BALL_LOGCB_ERROR_BLOCK(CALLBACK) |
#define | BALL_LOGCB_FATAL_BLOCK(CALLBACK) |
#define | BALL_LOGCB_END "" |
#define | BALL_LOGVA_CONST_IMP(SEVERITY, ...) |
#define | BALL_LOGVA(SEVERITY, ...) |
#define | BALL_LOGVA_TRACE(...) BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_TRACE, __VA_ARGS__) |
#define | BALL_LOGVA_DEBUG(...) BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG, __VA_ARGS__) |
#define | BALL_LOGVA_INFO(...) BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_INFO, __VA_ARGS__) |
#define | BALL_LOGVA_WARN(...) BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_WARN, __VA_ARGS__) |
#define | BALL_LOGVA_ERROR(...) BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_ERROR, __VA_ARGS__) |
#define | BALL_LOGVA_FATAL(...) BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_FATAL, __VA_ARGS__) |
#define | BALL_LOG_IS_ENABLED(SEVERITY) |
Provide macros and utility functions to facilitate logging.
C
e_TRACE
severity levele_DEBUG
severity levele_INFO
severity levele_WARN
severity levele_ERROR
severity levele_FATAL
severity levelSEV
levele_TRACE
log record using callback CB
e_DEBUG
log record using callback CB
e_INFO
log record using callback CB
e_WARN
log record using callback CB
e_ERROR
log record using callback CB
e_FATAL
log record using callback CB
SEV
log record using callbacke_TRACE
record using printf
formate_DEBUG
record using printf
formate_INFO
record using printf
formate_WARN
record using printf
formate_ERROR
record using printf
formate_FATAL
record using printf
formatSEV
log record using printf
formate_TRACE
condition of executione_DEBUG
condition of executione_INFO
condition of executione_WARN
condition of executione_ERROR
condition of executione_FATAL
condition of executionSEV
conditione_TRACE
block with the specified callbacke_DEBUG
block with the specified callbacke_INFO
block with the specified callbacke_WARN
block with the specified callbacke_ERROR
block with the specified CB
e_FATAL
block with the specified callbackSEV
block with the specified CB
SEV
is severe enough for loggingThis component provides preprocessor macros and utility functions to facilitate use of the ball_loggermanager component. In particular, the macros defined herein greatly simplify the mechanics of generating log records. The utility functions provided in ball::Log
are intended only for use by the macros and should not be called directly.
The macros defined herein pertain to the logger manager singleton only, and not to any non-singleton instances of ball::LoggerManager
. In particular, the macros do not have any effect unless the logger manager singleton is initialized. Note that the flow of control may pass through a use of any of the macros before the logger manager singleton has been initialized or after it has been destroyed; however, control should not pass through any macro use during logger manager singleton initialization or destruction. See {ball_loggermanager |Logger Manager Singleton Initialization} for details on the recommended procedure for initializing the singleton.
All macros defined in this component are thread-safe, and can be invoked concurrently by multiple threads.
Additionally, each use of a logging macro will create a distinct log record, and ball::Observer
implementations (like those in ball
) generally guarantee that output for different log records are not interleaved.
This section documents the preprocessor macros defined in this component.
The first three macros described below are used to define categories, at either block scope or class scope, to which records are logged by the C++ stream-based and printf
-style logging macros (described further below).
The following two macros are used to establish logging categories that have block scope:
BALL_LOG_SET_CATEGORY(CATEGORY)
: Set a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
). On the first invocation of this macro in a code block, the ball::Log::setCategory
method is invoked to retrieve the address of an appropriate category structure for its scope; subsequent invocations will use a cached address of the category. (See the function-level documentation of ball::Log::setCategory
for more information.) This macro must be used at block scope, and can be used at most once in any given block (or else a compiler diagnostic will result).
BALL_LOG_SET_DYNAMIC_CATEGORY(CATEGORY)
: Set, on EACH invocation, a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
). On EVERY invocation of this macro in a code block, the ball::Log::setCategory
method is invoked to retrieve the address of an appropriate category structure for its scope; the address returned from ball::Log::setCategory
is NOT cached for subsequent calls. (See the function-level documentation of ball::Log::setCategory
for more information.) This macro must be used at block scope and can be used at most once in any given block (or else a compiler diagnostic will result). Note that this macro should be used to create categories that depend on RUN-TIME values only (e.g., LUW or UUID).
There can be at most one use of either BALL_LOG_SET_CATEGORY
or BALL_LOG_SET_DYNAMIC_CATEGORY
in any given block (or else a compiler diagnostic will result). Note that categories that are set using these macros, including dynamic categories, are not destroyed until the logger manager singleton is destroyed.
The following macro is used to establish logging categories that have class scope:
BALL_LOG_SET_CLASS_CATEGORY(CATEGORY)
: Set a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
) in the scope of the class within which this macro is used. Similar to BALL_LOG_SET_CATEGORY
, the category is set once only, the first time that it is accessed (i.e., it is not a dynamic category). This macro must be used, at most once, within the definition of a class or class template (or else a compiler diagnostic will result). Note that use of this macro may occur in either a public
, private
, or protected
section of a class's interface, although private
should be preferred.
Note that similar to block-scope categories (see BALL_LOG_SET_CATEGORY
and BALL_LOG_SET_DYNAMIC_CATEGORY
), class-scope categories are not destroyed until the logger manager singleton is destroyed.
The following macro is used to establish logging categories that have namespace or global scope:
BALL_LOG_SET_NAMESPACE_CATEGORY(CATEGORY)
: Set a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
) in the namespace (or global) scope within which this macro is used. Similar to BALL_LOG_SET_CATEGORY
, the category is set once only, the first time that it is accessed (i.e., it is not a dynamic category). This macro may be used, in .cpp
files only, at most once in any given namespace and at most once at global scope (or else a compiler diagnostic will result). Do NOT use this macro in .h
files.
Note that similar to block-scope categories (see BALL_LOG_SET_CATEGORY
and BALL_LOG_SET_DYNAMIC_CATEGORY
), namespace-scope categories are not destroyed until the logger manager singleton is destroyed.
The following macros are used to establish logging categories having thresholds that are given by the existing non-default category whose name matches the longest prefix of the new category's name (i.e., the threshold levels of new categories are determined "hierarchically" from existing categories rather than from the default threshold levels of the logger manager singleton).
BALL_LOG_SET_CATEGORY_HIERARCHICALLY(CATEGORY)
Set a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
). On the first invocation of this macro in a code block, the ball::Log::setCategoryHierarchically
method is invoked to retrieve the address of an appropriate category structure for its scope; subsequent invocations will use a cached address of the category. (See the function-level documentation of ball::Log::setCategoryHierarchically
for more information.) This macro must be used at block scope, and can be used at most once in any given block (or else a compiler diagnostic will result).
BALL_LOG_SET_DYNAMIC_CATEGORY_HIERARCHICALLY(CATEGORY)
: Set, on EACH invocation, a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
). On EVERY invocation of this macro in a code block, the ball::Log::setCategoryHierarchically
method is invoked to retrieve the address of an appropriate category structure for its scope; the address returned from ball::Log::setCategoryHierarchically
is NOT cached for subsequent calls. (See the function-level documentation of ball::Log::setCategoryHierarchically
for more information.) This macro must be used at block scope and can be used at most once in any given block (or else a compiler diagnostic will result). Note that this macro should be used to create categories that depend on RUN-TIME values only (e.g., LUW or UUID).
BALL_LOG_SET_CLASS_CATEGORY_HIERARCHICALLY(CATEGORY)
Set a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
) in the scope of the class within which this macro is used. Similar to BALL_LOG_SET_CATEGORY_HIERARCHICALLY
, the category is set once only, using the ball::Log::setCategoryHierarchically
function, the first time that it is accessed (i.e., it is not a dynamic category). (See the function-level documentation for ball::Log::setCategoryHierarchically
for more information.) This macro must be used, at most once, within the definition of a class or class template (or else a compiler diagnostic will result). Note that use of this macro may occur in either a public
, private
, or protected
section of a class's interface, although private
should be preferred.
BALL_LOG_SET_NAMESPACE_CATEGORY_HIERARCHICALLY(CATEGORY)
Set a category for logging to the specified CATEGORY
(assumed to be of type convertible to const char *
) in the namespace (or global) scope within which this macro is used. Similar to BALL_LOG_SET_CATEGORY_HIERARCHICALLY
, the category is set once only, using the ball::Log::setCategoryHierarchically
function, the first time that it is accessed (i.e., it is not a dynamic category). (See the function-level documentation for ball::Log::setCategoryHierarchically
for more information.) This macro may be used, in .cpp
files only, at most once in any given namespace and at most once at global scope (or else a compiler diagnostic will result). Do NOT use this macro in .h
files.
The macros defined in this subsection are the ones that are actually used to produce log records. A use of any one of the logging macros requires that a logging category (as established by the macros defined above) be in scope at the point where the macro is used. Note that the formatted string that is generated for the message attribute of each log record includes the category that is in scope and the filename as established by the standard __FILE__
macro.
The code within any logging statement/code block must not produce any side effects because it may or may not be executed based on run-time configuration of the ball
logging subsystem:
A set of macros based on C++ streams, BALL_LOG_TRACE
, BALL_LOG_DEBUG
, BALL_LOG_INFO
, BALL_LOG_WARN
, BALL_LOG_ERROR
, and BALL_LOG_FATAL
, are the ones most commonly used for logging. They have the following usage pattern:
A closely-related macro also based on C++ streams, BALL_LOG_STREAM
, requires that the severity be explicitly supplied as an argument:
Another set of macros based on C++ streams, similar to BALL_LOG_TRACE
, etc., allow the caller to specify a "callback" function that is passed the ball::UserFields *
used to represent the user fields of a log record. BALL_LOGCB_TRACE
, BALL_LOGCB_DEBUG
, BALL_LOGCB_INFO
, BALL_LOGCB_WARN
, BALL_LOGCB_ERROR
, and BALL_LOGCB_FATAL
have the following usage pattern:
A closely-related macro also based on C++ streams, BALL_LOGCB_STREAM
, requires that the severity be explicitly supplied as an argument:
The remaining macros are based on printf
-style format specifications:
A closely-related printf
-style macro, BALL_LOGVA
, requires that the severity be explicitly supplied as an argument:
The following macros allow the caller to start a code block that will be conditionally executed depending on the current logging threshold of the category that is in scope of those macros:
A closely-related macro, BALL_LOG_STREAM_BLOCK
, requires that the severity be explicitly supplied as an argument:
Another set of macros, similar to BALL_LOG_*_BLOCK
, allow the caller to specify a "callback" function that is passed the ball::UserFields *
used to represent the user fields of a log record:
A closely-related macro, BALL_LOGCB_STREAM_BLOCK
, requires that the severity be explicitly supplied as an argument:
Within the logging code block a special macro, BALL_LOG_OUTPUT_STREAM
, provides access to the log stream.
The following utility macro is intended for special-purpose use for fine-tuning logging behavior. A use of this macro requires that a logging category (as established by the macros defined above) be in scope at the point where the macro is used.
The following code fragments illustrate the standard pattern of macro usage.
The following trivial example shows how to use the logging macros to log messages at various levels of severity.
First, we initialize the log category within the context of this function. The logging macros such as BALL_LOG_ERROR
will not compile unless a category has been specified in the current lexical scope:
Then, we record messages at various levels of severity. These messages will be conditionally written to the log depending on the current logging threshold of the category (configured using the ball::LoggerManager
singleton):
Next, we demonstrate how to use proprietary code within logging macros. Suppose you want to add the content of a vector to the log trace:
Note that the code block will be conditionally executed depending on the current logging threshold of the category. The code within the block must not produce any side effects, because its execution depends on the current logging configuration. The special macro BALL_LOG_OUTPUT_STREAM
provides access to the log stream within the block.
This example provides more detail on setting the log category in the current lexical scope. The following macro instantiation sets the category for logging to be "EQUITY.NASD" in the enclosing lexical scope:
Note that this macro must not be used at file scope and it can be used at most once in any given block (or else a compiler diagnostic will result). A different category may be established to override one that is in effect, but it must occur in a nested scope. In any case, a use of this macro (or of BALL_LOG_SET_DYNAMIC_CATEGORY
) must be visible from within the lexical scope of every use of the log-generating macros. The following fragment of code shows how to set a different category in a nested inner block that hides a category set in an enclosing block:
Within logIt
, a requisite logging category is visible at each of the locations marked by [*]
.
The preferred logging method we use, the iostream
-style macros such as BALL_LOG_INFO
, allow streaming via the bsl::ostream
class
and the C++ stream operator <<
. An advantage the C++ streaming style has over the printf
style output (shown below in example 4) is that complex types often have the operator<<(ostream&, const TYPE&)
function overloaded so that they are able to be easily streamed to output. We demonstrate this here using C++ streaming to stream a bdlt::Date
to output:
We are logging with category "EQUITY.NASD", which is configured for a pass-through level of e_INFO
, from here on. We output a line using the BALL_LOG_INFO
macro:
The above results in the following single-line message being output:
<ts>
is the timestamp, <pid>
is the process id, <tid>
is the thread id, x.cpp
is the expansion of the __FILE__
macro that is the name of the source file containing the call, 1161 is the line number of the call, and the trailing date following "settlement date" is the value of settle
.
Next, we set the category to "EQUITY.NASD.SUNW", which has been defined with ball::Administration::addCategory
with its pass-through level set to e_INFO
and the trigger levels set at or above e_ERROR
, so a level of e_WARN
also passes through:
The above results in the following message to category "EQUITY.NASD.SUNW":
Now, the category "EQUITY.NASD.SUNW" just went out of scope and category "EQUITY.NASD" is visible again, so it applies to the following:
Finally, the above results in the following single-line message being output:
The settlement date was appended to the message as a simple illustration of the added flexibility provided by the C++ stream-based macros. This last message was logged to category "EQUITY.NASD" at severity level ball::Severity::e_INFO
.
The C++ stream-based macros, as opposed to the printf
-style macros, ensure at compile-time that no run-time format mismatches will occur. Use of the stream-based logging style exclusively will likely lead to clearer, more maintainable code with fewer initial defects.
Note that all uses of the log-generating macros, both printf
-style and C++ stream-based, must occur within function scope (i.e., not at file scope).
In the following example, we expand the logIt
function (defined above) to log two messages using the BALL_LOGVA_INFO
logging macro provided by this component. This variadic macro takes a format string and a variable-length series of arguments, similar to printf
.
Because we can't easily printf
complex types like bdlt::Date
or bsl::string
, we have to convert settleDate
to a const char *
ourselves. Note that all this additional work was unnecessary in Example 3 when we used the C++ iostream
-style, rather than the printf
-style, macros.
We set logging with category "EQUITY.NASD", which was configured for a pass-through severity level of e_INFO
, and call BALL_LOGVA_INFO
to print our trade:
The above results in the following single-line message being output to category "EQUITY.NASD.SUNW" at severity level ball::Severity::e_INFO
:
In the above, <ts>
is the timestamp, <pid>
is the process id, <tid>
is the thread id, x.cpp
is the expansion of the __FILE__
macro that is the name of the source file containing the call, and 1256 is the line number of the call.
Note that the first argument supplied to the BALL_LOGVA_INFO
macro is a printf
-style format specification.
Next, we set the category to "EQUITY.NASD.SUNW", which is configured for a pass-through severity level of e_INFO
:
The above results in the following single-line message to category "EQUITY.NASD.SUNW":
Now, the category "EQUITY.NASD.SUNW" just went out of scope and category "EQUITY.NASD" is visible again, so it applies to the following:
Finally, the above results in the following single-line message being output:
Logging must sometimes be controlled by parameters that are not available until run-time. The BALL_LOG_SET_DYNAMIC_CATEGORY
macro sets a category each time it is invoked (unlike BALL_LOG_SET_CATEGORY
, which sets a category only on the first invocation and uses the cached address of the category on subsequent invocations). The category name in the following processSecurity
function is a combination of a static prefix and the (dynamic) exchange
argument:
Now logging can be controlled independently for each exchange
.
WARNING: Along with the added flexibility provided by dynamic categories comes the additional overhead of computing and setting a category on each invocation. Consequently, dynamic categories should be used SPARINGLY in most applications.
The following example demonstrates the use of attributes and rules to conditionally enable logging.
We start by defining a function, processData
, that is passed data in a vector<char>
and information about the user who sent the data. This example function performs no actual processing, but does log a single message at the ball::Severity::e_DEBUG
threshold level. The processData
function also adds the user information passed to this function to the thread's attribute context. We will use these attributes later, to create a logging rule that enables verbose logging only for a particular user.
We add our attributes using ball::ScopedAttribute
, which adds an attribute container with one attribute to a list of containers. This is easy and efficient if the number of attributes is small, but should not be used if there are a large number of attributes. If motivated, we could use ball::DefaultAttributeContainer
, which provides an efficient container for a large number of attributes, or even create a more efficient attribute container implementation specifically for these three attributes (uuid, luw, and terminalNumber). See ball_scopedattributes (plural) for an example of using a different attribute container, and ball_attributecontainer for an example of creating a custom attribute container.
In this simplified example we perform no actual processing, and simply log a message at the ball::Severity::e_DEBUG
level.
Notice that if we were not using a "scoped" attribute container like that provided automatically by ball::ScopedAttribute
(e.g., if we were using a local ball::DefaultAttributeContainer
instead), then the container must be removed from the ball::AttributeContext
before it is destroyed! See ball_scopedattributes (plural) for an example.
Next we demonstrate how to create a logging rule that sets the pass-through logging threshold to ball::Severity::e_TRACE
(i.e., enables verbose logging) for a particular user when calling the processData
function defined above.
We start by creating the singleton logger manager that we configure with the stream observer and a default configuration. We then call the processData
function: This first call to processData
will not result in any logged messages because processData
logs its message at the ball::Severity::e_DEBUG
level, which is below the default configured logging threshold.
Now we add a logging rule, setting the pass-through threshold to be ball::Severity::e_TRACE
(i.e., enabling verbose logging) if the thread's context contains an attribute with name "mylibrary.uuid" with value 3938908. Note that we use the wild-card value *
for the category so that the ball::Rule
rule will apply to all categories.
The final call to the processData
function below, passes a uuid
of 2171395 (not 3938908) so the logging rule we defined will not apply and no message will be logged.
The resulting logged output for this example looks like the following:
The following example demonstrates how to register a logging callback. The C++ stream-based macros that take a callback are particularly useful to seamlessly populate the user fields of a record, thus simplifying the logging line.
We define a callback function populateUsingPoint
that appends to the specified fields
the attributes of the point
to log:
We now bind our callback function populateUsingPoint
and the supplied point
to a functor object we will pass to the logging callback. Note that the callback supplied to the logging macro must match the prototype void (*)(ball::UserFields *)
.
The following example demonstrates how to define and use logging categories that have class scope.
First, we define a class, Thing
, for which we want to do class-scope logging. The use of the BALL_LOG_SET_CLASS_CATEGORY
macro generates the requisite declarations within the definition of the class. We have used the macro in a private
section of the interface, which should be preferred, but public
(or protected
) is fine, too:
Next, we define the inlineMethodThatLogs
method inline
within the header file and log to the class-scope category using BALL_LOG_TRACE
. Since there is no other category in scope, the record is necessarily logged to the "PCKG.THING" category that is within the scope of the Thing
class:
Now, we define the outOfLineMethodThatLogs
method within the .cpp
file. On each invocation, this method logs one record using BALL_LOG_TRACE
. It logs to the "PCKG.THING" class-scope category if useClassCategory
is true
, and logs to the "X.Y.Z" block-scope category otherwise:
Finally, note that both block-scope and class-scope categories can be logged to within the same block. For example, the following block within a Thing
method would first log to "PCKG.THING" then log to "X.Y.Z":
#define BALL_LOG_CATEGORY (ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)->category()) |
#define BALL_LOG_DEBUG |
#define BALL_LOG_DEBUG_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG) |
#define BALL_LOG_END "" |
#define BALL_LOG_ERROR |
#define BALL_LOG_ERROR_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_ERROR) |
#define BALL_LOG_FATAL |
#define BALL_LOG_FATAL_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_FATAL) |
#define BALL_LOG_INFO |
#define BALL_LOG_INFO_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_INFO) |
#define BALL_LOG_IS_ENABLED | ( | SEVERITY | ) |
#define BALL_LOG_OUTPUT_STREAM (ball_log_lOg_StReAm.stream()) |
#define BALL_LOG_RECORD (ball_log_lOg_StReAm.record()) |
#define BALL_LOG_SET_CATEGORY | ( | CATEGORY | ) |
#define BALL_LOG_SET_CATEGORY_HIERARCHICALLY | ( | CATEGORY | ) |
#define BALL_LOG_SET_CLASS_CATEGORY | ( | CATEGORY | ) |
#define BALL_LOG_SET_CLASS_CATEGORY_HIERARCHICALLY | ( | CATEGORY | ) |
#define BALL_LOG_SET_DYNAMIC_CATEGORY | ( | CATEGORY | ) |
#define BALL_LOG_SET_DYNAMIC_CATEGORY_HIERARCHICALLY | ( | CATEGORY | ) |
#define BALL_LOG_SET_NAMESPACE_CATEGORY | ( | CATEGORY | ) |
#define BALL_LOG_SET_NAMESPACE_CATEGORY_HIERARCHICALLY | ( | CATEGORY | ) |
#define BALL_LOG_STREAM | ( | SEVERITY | ) | BALL_LOG_STREAM_IMP((SEVERITY)) BALL_LOG_OUTPUT_STREAM |
#define BALL_LOG_STREAM_BLOCK | ( | SEVERITY | ) | BALL_LOG_STREAM_IMP((SEVERITY)) |
#define BALL_LOG_STREAM_CONST_IMP | ( | SEVERITY | ) |
#define BALL_LOG_STREAM_IMP | ( | SEVERITY | ) |
#define BALL_LOG_THRESHOLD (ball_log_getCategoryHolder(BALL_LOG_CATEGORYHOLDER)->threshold()) |
#define BALL_LOG_TRACE |
#define BALL_LOG_TRACE_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_TRACE) |
#define BALL_LOG_WARN |
#define BALL_LOG_WARN_BLOCK BALL_LOG_STREAM_CONST_IMP(BloombergLP::ball::Severity::e_WARN) |
#define BALL_LOGCB_DEBUG | ( | CALLBACK | ) |
#define BALL_LOGCB_DEBUG_BLOCK | ( | CALLBACK | ) |
#define BALL_LOGCB_END "" |
#define BALL_LOGCB_ERROR | ( | CALLBACK | ) |
#define BALL_LOGCB_ERROR_BLOCK | ( | CALLBACK | ) |
#define BALL_LOGCB_FATAL | ( | CALLBACK | ) |
#define BALL_LOGCB_FATAL_BLOCK | ( | CALLBACK | ) |
#define BALL_LOGCB_INFO | ( | CALLBACK | ) |
#define BALL_LOGCB_INFO_BLOCK | ( | CALLBACK | ) |
#define BALL_LOGCB_STREAM | ( | BALL_SEVERITY, | |
CALLBACK | |||
) | BALL_LOGCB_STREAM_IMP((BALL_SEVERITY), (CALLBACK)) BALL_LOG_OUTPUT_STREAM |
#define BALL_LOGCB_STREAM_BLOCK | ( | BALL_SEVERITY, | |
CALLBACK | |||
) | BALL_LOGCB_STREAM_IMP((BALL_SEVERITY), (CALLBACK)) |
#define BALL_LOGCB_STREAM_CONST_IMP | ( | SEVERITY, | |
CALLBACK | |||
) |
#define BALL_LOGCB_STREAM_IMP | ( | SEVERITY, | |
CALLBACK | |||
) |
#define BALL_LOGCB_TRACE | ( | CALLBACK | ) |
#define BALL_LOGCB_TRACE_BLOCK | ( | CALLBACK | ) |
#define BALL_LOGCB_WARN | ( | CALLBACK | ) |
#define BALL_LOGCB_WARN_BLOCK | ( | CALLBACK | ) |
#define BALL_LOGVA | ( | SEVERITY, | |
... | |||
) |
#define BALL_LOGVA_CONST_IMP | ( | SEVERITY, | |
... | |||
) |
#define BALL_LOGVA_DEBUG | ( | ... | ) | BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_DEBUG, __VA_ARGS__) |
#define BALL_LOGVA_ERROR | ( | ... | ) | BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_ERROR, __VA_ARGS__) |
#define BALL_LOGVA_FATAL | ( | ... | ) | BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_FATAL, __VA_ARGS__) |
#define BALL_LOGVA_INFO | ( | ... | ) | BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_INFO, __VA_ARGS__) |
#define BALL_LOGVA_TRACE | ( | ... | ) | BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_TRACE, __VA_ARGS__) |
#define BALL_LOGVA_WARN | ( | ... | ) | BALL_LOGVA_CONST_IMP(BloombergLP::ball::Severity::e_WARN, __VA_ARGS__) |