已更新 2025年4月
日志记录功能
以下 FreeRTOS 库使用日志记录功能:
日志记录宏
FreeRTOS 库使用以下 4 个日志记录宏,按详细程度递增的顺序排列。 例如,LogError() 仅在出现错误时调用,因此最不详细;而
LogDebug()
- LogError
- LogWarn
- LogInfo
- LogDebug
在使用时,日志记录宏可以像 printf() 一样接受可变数量的实参, 只不过需要使用双括号。例如,库以如下方式调用日志记录宏:
1LogInfo( ( “This prints an integer %d”, 100 ) );
您无需单独定义这四个日志记录宏。包含位于
FreeRTOS-Plus/Source/Utilities/logging/
SdkLog()
注意本页末尾代码片段中的头文件顺序。
定义 SdkLog 宏
应在正在使用的库的配置文件中包含
logging_stack.h
core_mqtt_config.h
logging_stack.h
要获取日志记录,必须定义 SkdLog() 以调用线程安全平台特定的打印函数。例如, 打印函数可能会将字符输出到串行端口或 TCP 套接字。由于日志记录宏 接受可变数量的参数,并且使用方式与 printf() 相同,因此平台特定的 打印函数必须具有与 printf() 相同的原型(参数列表)。例如,如果您的应用程序具有 对串行端口写入的 printf() 的线程安全版本,则可以将 SdkLog 定义为:
1#define SdkLog( X ) printf X
未定义的日志记录宏默认为空宏,不生成任何代码。
**注意:**如果不使用
FreeRTOS-Plus/Source/Utilities/logging/ 中的日志记录实用程序标头,
则可以通过在您的应用程序中定义宏来为您想要的日志记录级别单独定义四个日志记录宏,
但不推荐这种方法,因为这样会阻止 LIBRARY_LOG_LEVEL
和 LIBRARY_LOG_NAME 发挥作用。
设置详细级别
若要设置详细级别,在用于定义 SdkLog() 的同一配置文件中, 将 LIBRARY_LOG_LEVEL 宏定义为以下任一值。LIBRARY_LOG_LEVEL 的有效值包括:
- LOG_NONE(关闭日志记录)
- LOG_ERROR
- LOG_WARN
- LOG_INFO
- LOG_DEBUG
例如:
1#define LIBRARY_LOG_LEVEL LOG_NONE
设置文本名称
要设置文本名称,请在用于定义 SdkLog() 的同一配置文件中 将 LIBRARY_LOG_NAME 宏定义为字符串。每条日志消息都会打印名称,因此通常将名称设置为 库的名称。例如:
1#define LIBRARY_LOG_NAME “MQTT”
将名称设置为空字符串可节省程序空间。
设置日志中的元数据
要在日志消息中添加元数据(如日志消息的源代码位置),可以定义 LOG_METADATA_FORMAT 和 LOG_METADATA_ARGS 宏。
LOG_METADATA_FORMAT 宏应被定义为表示元数据格式字符串, 而 LOG_METADATA_ARGS 宏应被定义为传递格式字符串的元数据实参。 在传递给为 SdkLog 宏定义的平台特定打印函数的日志消息中, 这两个宏都有前缀。
例如,以下定义添加了发出日志消息的源文件的 函数名称和行号文件。
- #define LOG_METADATA_FORMAT “[%s:%d]”
- #define LOG_METADATA_ARGS __FUNCTION__, __LINE__
将元数据宏设置为空值可节省程序空间。
参考示例
请注意,在下面的示例链接和模板代码中,日志记录宏定义周围有
#ifndef
demo_config.h
有关 FreeRTOS 代码库中日志记录配置的示例,请参阅
基于 TLS 的 MQTT 双向验证 演示, 该演示
在
demo_config.h 文件中为演示应用程序任务(在 MutualAuthMQTTExample.c 中定义)配置了日志记录,
并在
core_mqtt_config.h
文件中为 coreMQTT 库配置了日志记录
。
以下是使用日志记录配置的模板。
1/**************************************************/2/******* DO NOT CHANGE the following order ********/3/**************************************************/45/* Include logging header files and define logging configurations in the6 * following order:7 * 1. Include the header file "logging_levels.h".8 * 2. Define the logging configurations for your application. It is required9 * to define LIBRARY_LOG_NAME, LIBRARY_LOG_LEVEL and SdkLog macros.10 * 3. Include the header file "logging_stack.h".11 */1213#include "logging_levels.h"1415/* Logging configurations for the application. */1617/* Set the application log name. */18#ifndef LIBRARY_LOG_NAME19 #define LIBRARY_LOG_NAME "MyApplication"20#endif2122/* Set the logging verbosity level. */23#ifndef LIBRARY_LOG_LEVEL24 #define LIBRARY_LOG_LEVEL LOG_INFO25#endif2627/* Define the metadata information to add in each log.28 * The example here sets the metadata to [:]. */29#if !defined( LOG_METADATA_FORMAT ) && !defined( LOG_METADATA_ARGS )30 #define LOG_METADATA_FORMAT "[%s:%d]"31 #define LOG_METADATA_ARGS __FILE__, __LINE__32#endif3334/* Define the platform-specific logging function to call from35 * enabled logging macros. */36#ifndef SdkLog37 #define SdkLog( message ) MyLogger message38#endif3940/************ End of logging configuration ****************/41