| // Copyright 2020 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| //============================================================================== |
| // |
| // This file describes Pigweed's public user-facing logging API. |
| // |
| // THIS PUBLIC API IS NOT STABLE OR COMPLETE! |
| // |
| // Key functionality is still missing: |
| // |
| // - API for controlling verbosity at compile time |
| // - API for controlling verbosity at run time |
| // - API for querying if logging is enabled for the given level or flags |
| // |
| #pragma once |
| |
| #include "pw_log/levels.h" |
| #include "pw_preprocessor/macro_arg_count.h" // PW_COMMA_ARGS |
| |
| // log_backend.h must ultimately resolve to a header that implements the macros |
| // required by the logging facade, as described below. |
| // |
| // Inputs: Macros the downstream user provides to control the logging system: |
| // |
| // PW_LOG_MODULE_NAME |
| // - The module name the backend should use |
| // |
| // Outputs: Macros log_backend.h is expected to provide: |
| // |
| // PW_LOG(level, flags, fmt, ...) |
| // - Required. |
| // Level - An integer level as defined by pw_log/levels.h |
| // Flags - Arbitrary flags the backend can leverage; user-defined. |
| // Example: HAS_PII - A log has personally-identifying data |
| // Example: HAS_DII - A log has device-identifying data |
| // Example: RELIABLE_DELIVERY - Ask backend to ensure the |
| // log is delivered; this may entail blocking other logs. |
| // Example: BEST_EFFORT - Don't deliver this log if it |
| // would mean blocking or dropping important-flagged logs |
| // |
| // PW_LOG_DEBUG(fmt, ...) |
| // PW_LOG_INFO(fmt, ...) |
| // PW_LOG_WARN(fmt, ...) |
| // PW_LOG_ERROR(fmt, ...) |
| // PW_LOG_CRITICAL(fmt, ...) |
| // - Optional. If not defined by the backend, the facade's default |
| // implementation defines these in terms of PW_LOG(). |
| // |
| #include "pw_log_backend/log_backend.h" |
| |
| // Default: Module name |
| #ifndef PW_LOG_MODULE_NAME |
| #define PW_LOG_MODULE_NAME "" |
| #endif // PW_LOG_MODULE_NAME |
| |
| // Default: Flags |
| #ifndef PW_LOG_NO_FLAGS |
| #define PW_LOG_NO_FLAGS 0 |
| #endif // PW_LOG_NO_FLAGS |
| |
| // Note: The filtering semantics are likely to change. |
| |
| // For backends that elect to only provide the general PW_LOG() macro and not |
| // specialized versions, define the standard PW_LOG_<level>() macros in terms |
| // of the general PW_LOG(). |
| #ifndef PW_LOG_DEBUG |
| #define PW_LOG_DEBUG(message, ...) \ |
| PW_LOG( \ |
| PW_LOG_LEVEL_DEBUG, PW_LOG_NO_FLAGS, message PW_COMMA_ARGS(__VA_ARGS__)) |
| #endif // PW_LOG_DEBUG |
| |
| #ifndef PW_LOG_INFO |
| #define PW_LOG_INFO(message, ...) \ |
| PW_LOG(PW_LOG_LEVEL_INFO, PW_LOG_NO_FLAGS, message PW_COMMA_ARGS(__VA_ARGS__)) |
| #endif // PW_LOG_INFO |
| |
| #ifndef PW_LOG_WARN |
| #define PW_LOG_WARN(message, ...) \ |
| PW_LOG(PW_LOG_LEVEL_WARN, PW_LOG_NO_FLAGS, message PW_COMMA_ARGS(__VA_ARGS__)) |
| #endif // PW_LOG_WARN |
| |
| #ifndef PW_LOG_ERROR |
| #define PW_LOG_ERROR(message, ...) \ |
| PW_LOG( \ |
| PW_LOG_LEVEL_ERROR, PW_LOG_NO_FLAGS, message PW_COMMA_ARGS(__VA_ARGS__)) |
| #endif // PW_LOG_ERROR |
| |
| #ifndef PW_LOG_CRITICAL |
| #define PW_LOG_CRITICAL(message, ...) \ |
| PW_LOG(PW_LOG_LEVEL_CRITICAL, \ |
| PW_LOG_NO_FLAGS, \ |
| message PW_COMMA_ARGS(__VA_ARGS__)) |
| #endif // PW_LOG_CRITICAL |
| |
| // Define short, usable names if requested. |
| // TODO(pwbug/17): Convert this to the config system when available. |
| #ifndef PW_LOG_USE_SHORT_NAMES |
| #define PW_LOG_USE_SHORT_NAMES 0 |
| #endif |
| |
| // Define ultra short, usable names if requested. |
| #ifndef PW_LOG_USE_ULTRA_SHORT_NAMES |
| #define PW_LOG_USE_ULTRA_SHORT_NAMES 0 |
| #endif // PW_LOG_USE_SHORT_NAMES |
| |
| // clang-format off |
| #if PW_LOG_USE_SHORT_NAMES |
| #define LOG PW_LOG |
| #define LOG_DEBUG PW_LOG_DEBUG |
| #define LOG_INFO PW_LOG_INFO |
| #define LOG_WARN PW_LOG_WARN |
| #define LOG_ERROR PW_LOG_ERROR |
| #define LOG_CRITICAL PW_LOG_CRITICAL |
| #endif // PW_LOG_USE_SHORT_NAMES |
| // clang-format on |
| |
| // clang-format off |
| #if PW_LOG_USE_ULTRA_SHORT_NAMES |
| #if !PW_LOG_USE_SHORT_NAMES |
| #define LOG PW_LOG |
| #endif // LOG |
| #define DBG PW_LOG_DEBUG |
| #define INF PW_LOG_INFO |
| #define WRN PW_LOG_WARN |
| #define ERR PW_LOG_ERROR |
| #define CRT PW_LOG_CRITICAL |
| #endif // PW_LOG_USE_ULTRA_SHORT_NAMES |
| // clang-format on |