| /* |
| * |
| * Copyright (c) 2013-2017 Nest Labs, Inc. |
| * All rights reserved. |
| * |
| * 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 |
| * |
| * http://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. |
| */ |
| |
| /** |
| * @file |
| * This file defines macros, constants, and interfaces for a |
| * platform-independent logging interface for the Weave SDK. |
| * |
| * Weave SDK clients may choose, at compile time, among Android, |
| * C Standard I/O, or external (platform- and integrator-defined) |
| * logging style implementations that will be invoked when any of |
| * the following preprocessor symbols are asserted: |
| * |
| * - #WEAVE_ERROR_LOGGING |
| * - #WEAVE_PROGRESS_LOGGING |
| * - #WEAVE_DETAIL_LOGGING |
| * |
| */ |
| |
| #ifndef WEAVELOGGING_H_ |
| #define WEAVELOGGING_H_ |
| |
| #include <stdint.h> |
| |
| #include <Weave/Core/WeaveConfig.h> |
| |
| /** |
| * @namespace nl::Weave::Logging |
| * |
| * @brief |
| * This namespace includes all interfaces within Weave for shared |
| * logging support. |
| * |
| * The interfaces include macros, constants, and functions for a |
| * platform-independent logging interface for the Weave SDK. |
| * |
| * Weave SDK clients may choose, at compile time, among Android, |
| * C Standard I/O, or external (platform- and integrator-defined) |
| * logging style implementations that will be invoked when any of |
| * the following preprocessor symbols are asserted: |
| * |
| * - #WEAVE_ERROR_LOGGING |
| * - #WEAVE_PROGRESS_LOGGING |
| * - #WEAVE_DETAIL_LOGGING |
| * |
| */ |
| |
| namespace nl { |
| namespace Weave { |
| namespace Logging { |
| |
| /** |
| * @enum LogModule |
| * |
| * @brief |
| * Identifies a logical section of code that is a source of log |
| * messages. |
| * |
| * @note If you add modules or rearrange this list you must update the |
| * ModuleNames tables in WeaveLogging.cpp. |
| * |
| */ |
| enum LogModule |
| { |
| kLogModule_NotSpecified = 0, |
| |
| kLogModule_Inet, |
| kLogModule_Ble, |
| kLogModule_MessageLayer, |
| kLogModule_SecurityManager, |
| kLogModule_ExchangeManager, |
| kLogModule_TLV, |
| kLogModule_ASN1, |
| kLogModule_Crypto, |
| kLogModule_DeviceManager, |
| kLogModule_Alarm, |
| kLogModule_BDX, |
| kLogModule_DataManagement, |
| kLogModule_DeviceControl, |
| kLogModule_DeviceDescription, |
| kLogModule_Echo, |
| kLogModule_FabricProvisioning, |
| kLogModule_NetworkProvisioning, |
| kLogModule_ServiceDirectory, |
| kLogModule_ServiceProvisioning, |
| kLogModule_SoftwareUpdate, |
| kLogModule_TokenPairing, |
| kLogModule_HeatLink, |
| kLogModule_TimeService, |
| kLogModule_WeaveTunnel, |
| kLogModule_Heartbeat, |
| kLogModule_WeaveSystemLayer, |
| kLogModule_DropcamLegacyPairing, |
| kLogModule_EventLogging, |
| kLogModule_Support, |
| |
| kLogModule_Max |
| }; |
| |
| /** |
| * @enum LogCategory |
| * |
| * @brief |
| * Identifies a category to which an particular error message |
| * belongs. |
| * |
| */ |
| enum LogCategory |
| { |
| /*!< |
| * This log category indicates, when passed to SetLogFilter(), |
| * that no messages should be logged. |
| * |
| */ |
| kLogCategory_None = 0, |
| |
| /*!< |
| * Indicates a category of log message that describes an unexpected |
| * or severe failure. |
| * |
| * This log category indicates that a logged message describes |
| * an unexpected or severe failure in the code. |
| * |
| * It should be used for things such as out-of-resource errors, |
| * internal inconsistencies, API misuse, etc. In general, errors |
| * that are expected to occur as part of normal operation, or |
| * that are largely determined by external factors (e.g. network |
| * errors, user/operator induced errors, etc.) should be logged |
| * as kLogCategory_Progress messages, not as kLogCategory_Error |
| * messages. |
| * |
| */ |
| kLogCategory_Error = 1, |
| |
| /*!< |
| * Indicates a category of log message that describes an event |
| * that marks the start or end of a major activity, or a major |
| * change in the state of the overall system. |
| * |
| * It should be reserved for high-level events. Such messages |
| * should provide the log reader with a good sense of the |
| * overall activity of the system at any point in time, while |
| * being minimally verbose. Where necessary such messages should |
| * include identifiers or other values that can be used to |
| * correlate messages involving a common actor or subject |
| * (e.g. connection ids, request ids, etc.) and/or to identify |
| * types of actions being taken or handled (e.g. message types, |
| * requested resource types, error numbers, etc.). |
| * |
| */ |
| kLogCategory_Progress = 2, |
| |
| /*!< |
| * Indicates a category of log message that describes detailed |
| * information about an event or the state of the system. |
| * |
| * Such messages can be used to provide ancillary information |
| * not suitable for the kLogCategory_Error and |
| * kLogCategory_Progress categories. |
| * |
| */ |
| kLogCategory_Detail = 3, |
| |
| /*!< |
| * Indicates a category of log message that describes information |
| * needed by IE and QA teams for automated testing. |
| * |
| */ |
| kLogCategory_Retain = 4, |
| |
| kLogCategory_Max = kLogCategory_Retain |
| }; |
| |
| extern void Log(uint8_t module, uint8_t category, const char *msg, ...); |
| extern uint8_t GetLogFilter(void); |
| extern void SetLogFilter(uint8_t category); |
| |
| #ifndef WEAVE_ERROR_LOGGING |
| #define WEAVE_ERROR_LOGGING 1 |
| #endif |
| |
| #ifndef WEAVE_LOG_FILTERING |
| #define WEAVE_LOG_FILTERING 1 |
| #endif |
| |
| #if WEAVE_ERROR_LOGGING |
| /** |
| * @def WeaveLogError(MOD, MSG, ...) |
| * |
| * @brief |
| * Log a Weave message for the specified module in the 'Error' |
| * category. |
| * |
| */ |
| #ifndef WeaveLogError |
| #define WeaveLogError(MOD, MSG, ...) nl::Weave::Logging::Log( nl::Weave::Logging::kLogModule_##MOD , nl::Weave::Logging::kLogCategory_Error, MSG, ## __VA_ARGS__) |
| #endif |
| #else |
| #define WeaveLogError(MOD, MSG, ...) |
| #endif |
| |
| #ifndef WEAVE_PROGRESS_LOGGING |
| #define WEAVE_PROGRESS_LOGGING 1 |
| #endif |
| |
| #if WEAVE_PROGRESS_LOGGING |
| /** |
| * @def WeaveLogProgress(MOD, MSG, ...) |
| * |
| * @brief |
| * Log a Weave message for the specified module in the 'Progress' |
| * category. |
| * |
| */ |
| #ifndef WeaveLogProgress |
| #define WeaveLogProgress(MOD, MSG, ...) nl::Weave::Logging::Log( nl::Weave::Logging::kLogModule_##MOD , nl::Weave::Logging::kLogCategory_Progress, MSG, ## __VA_ARGS__) |
| #endif |
| #else |
| #define WeaveLogProgress(MOD, MSG, ...) |
| #endif |
| |
| |
| #ifndef WEAVE_DETAIL_LOGGING |
| #define WEAVE_DETAIL_LOGGING 1 |
| #endif |
| |
| #if WEAVE_DETAIL_LOGGING |
| /** |
| * @def WeaveLogDetail(MOD, MSG, ...) |
| * |
| * @brief |
| * Log a Weave message for the specified module in the 'Detail' |
| * category. |
| * |
| */ |
| #ifndef WeaveLogDetail |
| #define WeaveLogDetail(MOD, MSG, ...) nl::Weave::Logging::Log( nl::Weave::Logging::kLogModule_##MOD , nl::Weave::Logging::kLogCategory_Detail, MSG, ## __VA_ARGS__) |
| #endif |
| #else |
| #define WeaveLogDetail(MOD, MSG, ...) |
| #endif |
| |
| #ifndef WEAVE_RETAIN_LOGGING |
| #define WEAVE_RETAIN_LOGGING WEAVE_PROGRESS_LOGGING |
| #define WeaveLogRetain(MOD, MSG, ...) WeaveLogProgress(MOD, MSG, ## __VA_ARGS__) |
| #endif |
| |
| #if WEAVE_RETAIN_LOGGING |
| /** |
| * @def WeaveLogRetain(MOD, MSG, ...) |
| * |
| * @brief |
| * Log a Weave message for the specified module in the 'Retain' |
| * category. This is used for IE testing. |
| * If the product has not defined WEAVE_RETAIN_LOGGING, it defaults to the same as WeaveLogProgress |
| * |
| */ |
| #ifndef WeaveLogRetain |
| #define WeaveLogRetain(MOD, MSG, ...) nl::Weave::Logging::Log( nl::Weave::Logging::kLogModule_##MOD , nl::Weave::Logging::kLogCategory_Retain, MSG, ## __VA_ARGS__) |
| #endif |
| |
| #else // #if WEAVE_RETAIN_LOGGING |
| #ifdef WeaveLogRetain |
| // This is to ensure that WeaveLogRetain is null if |
| // the product has defined WEAVE_RETAIN_LOGGING to 0 itself |
| #undef WeaveLogRetain |
| #endif |
| #define WeaveLogRetain(MOD, MSG, ...) |
| #endif // #if WEAVE_RETAIN_LOGGING |
| |
| |
| #if WEAVE_ERROR_LOGGING || WEAVE_PROGRESS_LOGGING || WEAVE_DETAIL_LOGGING || WEAVE_RETAIN_LOGGING |
| #define _WEAVE_USE_LOGGING 1 |
| #else |
| #define _WEAVE_USE_LOGGING 0 |
| #endif /* WEAVE_ERROR_LOGGING || WEAVE_PROGRESS_LOGGING || WEAVE_DETAIL_LOGGING || WEAVE_RETAIN_LOGGING */ |
| |
| #if _WEAVE_USE_LOGGING |
| |
| #define nlWeaveLoggingWeavePrefixLen 6 |
| #define nlWeaveLoggingModuleNameLen 3 |
| #define nlWeaveLoggingMessageSeparatorLen 2 |
| #define nlWeaveLoggingMessageTrailerLen 2 |
| #define nlWeaveLoggingTotalMessagePadding (nlWeaveLoggingWeavePrefixLen + \ |
| nlWeaveLoggingModuleNameLen + \ |
| nlWeaveLoggingMessageSeparatorLen + \ |
| nlWeaveLoggingMessageTrailerLen) |
| |
| extern void GetMessageWithPrefix(char *buf, uint8_t bufSize, uint8_t module, const char *msg); |
| extern void GetModuleName(char *buf, uint8_t module); |
| void PrintMessagePrefix(uint8_t module); |
| |
| #else |
| |
| static inline void GetMessageWithPrefix(char *buf, uint8_t bufSize, uint8_t module, const char *msg) |
| { |
| return; |
| } |
| |
| static inline void GetModuleName(char *buf, uint8_t module) |
| { |
| return; |
| } |
| |
| #endif // _WEAVE_USE_LOGGING |
| |
| #if WEAVE_LOG_FILTERING |
| |
| extern uint8_t gLogFilter; |
| |
| #define IsCategoryEnabled(CAT) ((CAT) <= gLogFilter) |
| |
| #else // WEAVE_LOG_FILTERING |
| |
| #define IsCategoryEnabled(CAT) (true) |
| |
| #endif // WEAVE_LOG_FILTERING |
| |
| |
| |
| /** |
| * @def WeaveLogIfFalse(aCondition) |
| * |
| * @brief |
| * This checks for the specified condition, which is expected to |
| * commonly be true and emits some log, based on configuration, if |
| * the condition is false. |
| * |
| * @note |
| * Evaluation of @a aCondition is always done, but logging is only enabled when |
| * #WEAVE_CONFIG_ENABLE_CONDITION_LOGGING is enabled. This can be turned on or |
| * off for each compilation unit by enabling or disabling, as desired, |
| * #WEAVE_CONFIG_ENABLE_CONDITION_LOGGING before WeaveLogging.h is included by |
| * the preprocessor. |
| * |
| * Example Usage: |
| * |
| * @code |
| * #define WEAVE_CONFIG_ENABLE_CONDITION_LOGGING 1 |
| * |
| * #include <Weave/Support/Logging/WeaveLogging.h> |
| * |
| * ... |
| * |
| * void foo(void) |
| * { |
| * WEAVE_ERROR err = WEAVE_NO_ERROR; |
| * |
| * ... |
| * |
| * exit: |
| * WeaveLogIfFalse(WEAVE_END_OF_TLV == err); |
| * } |
| * @endcode |
| * |
| * @param[in] aCondition A Boolean expression to be evaluated. |
| * |
| * @sa #WEAVE_CONFIG_ENABLE_TRACE_ON_CHECK_FAILURE |
| * |
| */ |
| |
| #if WEAVE_CONFIG_ENABLE_CONDITION_LOGGING && !defined(WeaveLogIfFalse) |
| |
| #define WeaveLogIfFalse(aCondition) \ |
| do \ |
| { \ |
| if (!(aCondition)) \ |
| { \ |
| WeaveLogError(NotSpecified, "Condition Failed (%s) at %s:%d", \ |
| #aCondition, __FILE__, __LINE__); \ |
| } \ |
| } while (0) |
| |
| #else // WEAVE_CONFIG_ENABLE_CONDITION_LOGGING |
| |
| #define WeaveLogIfFalse(aCondition) \ |
| IgnoreUnusedVariable(aCondition) |
| |
| #endif // WEAVE_CONFIG_ENABLE_CONDITION_LOGGING |
| |
| |
| /** |
| * @def WeaveLogFunctError(aErr) |
| * |
| * @brief |
| * If the given error value (@a aErr) is not successful (!= WEAVE_NO_ERROR), |
| * the method logs the file name, line number, and the error code. |
| * |
| * @note |
| * Evaluation of @a aErr is always done, but logging is only enabled when |
| * #WEAVE_CONFIG_ENABLE_FUNCT_ERROR_LOGGING is enabled. This can be turned |
| * on or off for each compilation unit by enabling or disabling, as desired, |
| * #WEAVE_CONFIG_ENABLE_FUNCT_ERROR_LOGGING before WeaveLogging.h is included |
| * by the preprocessor. |
| * |
| * Example Usage: |
| * |
| * @code |
| * #define WEAVE_CONFIG_ENABLE_FUNCT_ERROR_LOGGING 1 |
| * |
| * #include <Weave/Support/Logging/WeaveLogging.h> |
| * |
| * ... |
| * |
| * void foo(void) |
| * { |
| * WEAVE_ERROR err = WEAVE_NO_ERROR; |
| * |
| * ... |
| * |
| * exit: |
| * WeaveLogFunctError(err); |
| * } |
| * @endcode |
| * |
| * @param[in] aStatus A scalar status to be evaluated against WEAVE_NO_ERROR. |
| * |
| * @sa #WEAVE_CONFIG_ENABLE_FUNCT_ERROR_LOGGING |
| * |
| */ |
| |
| #if WEAVE_CONFIG_ENABLE_FUNCT_ERROR_LOGGING && !defined(WeaveLogFunctError) |
| |
| #define WeaveLogFunctError(aErr) \ |
| do \ |
| { \ |
| if ((aErr) != WEAVE_NO_ERROR) \ |
| { \ |
| WeaveLogError(NotSpecified, "%s at %s:%d", nl::ErrorStr(aErr), __FILE__, __LINE__);\ |
| } \ |
| } while (0) |
| |
| #else // WEAVE_CONFIG_ENABLE_FUNCT_ERROR_LOGGING |
| |
| #define WeaveLogFunctError(aErr) \ |
| IgnoreUnusedVariable(aErr) |
| |
| #endif // WEAVE_CONFIG_ENABLE_FUNCT_ERROR_LOGGING |
| |
| |
| |
| } // namespace Logging |
| } // namespace Weave |
| } // namespace nl |
| |
| #endif /* WEAVELOGGING_H_ */ |