diff options
Diffstat (limited to 'pw_log/tokenized_args.rst')
-rw-r--r-- | pw_log/tokenized_args.rst | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/pw_log/tokenized_args.rst b/pw_log/tokenized_args.rst new file mode 100644 index 000000000..d88910579 --- /dev/null +++ b/pw_log/tokenized_args.rst @@ -0,0 +1,76 @@ +.. _module-pw_log-tokenized-args: + +----------------------- +Tokenized log arguments +----------------------- +The ``pw_log`` facade is intended to make the logging backend invisible to the +user, but some backend features require additional frontend support, +necessitating a break in the abstraction. One of these features is the logging +of nested token arguments in tokenized logs, because only the user is able to +know which log arguments can be tokens (see :ref:`module-pw_tokenizer` for +context on tokenization, and :ref:`module-pw_log_tokenized` for an example of +a tokenized logging backend). Arguments that have already been tokenized are +just unsigned integers, and not all strings can be compile-time constants, so +users must be provided with a way of manually marking token arguments. + +To this end, ``pw_log/tokenized_args.h`` aliases macros from ``pw_tokenizer`` +to enable logging nested tokens when the active backend uses tokenization. +These alias macros revert to plain string logging otherwise, allowing projects +to take advantage of nested token logging without breaking readable logs when +the project is built with a different logging backend. To support logging +nested token arguments, a ``pw_log`` backend must add an empty file +``log_backend_uses_pw_tokenizer.h`` under ``public_overrides/pw_log_backend/``. + +Although the detokenizing backend accepts several different numeric bases, the +macros currently only support formatting nested tokens in hexadecimal, which +affects how the arguments appear in final logs if they cannot be detokenized +for any reason. Undetokenized tokens will appear inline as hex integers +prefixed with ``$#``, e.g. ``$#34d16466``. + +.. doxygendefine:: PW_LOG_TOKEN_TYPE +.. doxygendefine:: PW_LOG_TOKEN +.. doxygendefine:: PW_LOG_TOKEN_EXPR +.. doxygendefine:: PW_LOG_TOKEN_FMT + +Example usage with inline string arguments: + +.. code-block:: cpp + + #include "pw_log/log.h" + #include "pw_log/tokenized_args.h" + + // bool active_ + PW_LOG_INFO("Component is " PW_LOG_TOKEN_FMT(), + active_ ? PW_LOG_TOKEN_EXPR("active") + : PW_LOG_TOKEN_EXPR("idle")); + +Example usage with enums: + +.. code-block:: cpp + + #include "pw_log/log.h" + #include "pw_log/tokenized_args.h" + + namespace foo { + + enum class Color { kRed, kGreen, kBlue }; + + PW_LOG_TOKEN_TYPE ColorToToken(Color color) { + switch (color) { + case Color::kRed: + return PW_LOG_TOKEN_EXPR("kRed"); + case Color::kGreen: + return PW_LOG_TOKEN_EXPR("kGreen"); + case Color::kBlue: + return PW_LOG_TOKEN_EXPR("kBlue"); + default: + return PW_LOG_TOKEN_EXPR("kUnknown"); + } + } + + } // namespace foo + + void LogColor(foo::Color color) { + PW_LOG("Color: [" PW_LOG_TOKEN_FMT() "]", color) + } + |