.. _module-pw_log-tokenized-args: ----------------------- Tokenized log arguments ----------------------- .. pigweed-module-subpage:: :name: pw_log 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) }